V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lianghui
V2EX  ›  分享创造

分享 给 pythoner 简单好使的数据库访问库 dbpy

  •  1
     
  •   lianghui ·
    whiteclover · 2015-01-14 11:26:28 +08:00 · 3305 次点击
    这是一个创建于 3426 天前的主题,其中的信息可能已经有所发展或是发生改变。

    也许是最后一个python的分享,最近C++分布式群组聊天项目比较折腾。个人觉得这个库是比较通用的,那些在自己写数据库封装或者使用tornado db, dbutil这样的简单的db访问封装可以试试。

    https://github.com/thomashuang/dbpy

    功能:

    1. 灵活简单
    2. 天马行空的SQL构建语法糖
    3. 线程安全的连接池
    4. 好使的读写分离
    5. 支持简单事务

    设计主要借鉴的php的drupal database的设计。设计模式和以前写的项目差不多更像c/c++系项目风格,主要使用单例,工厂和适配设计模式,不过稍稍的pythonic了下。

    贴一段代码:

    or_cond = db.or_().condition('field1', 1).condition('field2', 'blabla')
    and_cond = (db.and_().condition('field3', 'what')
                 .condition('field4', 'then?'))
    print (db.select('table_name').condition(or_cond)
                    .condition(and_cond))
    
    # > SELECT * FROM `table_name`
    # > WHERE  ( `field1` = %s OR `field2` = %s ) AND ( `field3` = %s AND `field4` = %s )
    
    
    q = (db.insert('users').fields('name').values({'name': 'insert_1'})
                       .values(('insert_2',)))
    # > INSERT INTO `users` (`name`) VALUES(%s)
    print q._values 
    # > [('insert_1',) ('insert_2',)]
    
    13 条回复    2015-01-18 20:25:33 +08:00
    baoyexi
        1
    baoyexi  
       2015-01-14 11:28:34 +08:00 via iPhone
    Pythonist | Pythonista | Pythoneer 但是没有 Pythoner 的说法。
    lianghui
        2
    lianghui  
    OP
       2015-01-14 11:29:33 +08:00
    @baoyexi 恩,好吧,谢谢提醒。纠正
    mywaiting
        3
    mywaiting  
       2015-01-14 12:00:21 +08:00
    有个有点相似的 https://github.com/PaulGuo/F2E.im/blob/master/lib/query.py

    那个 and_ 和 or_ 语句感觉有些过度设计了,直接增加一个 where 的功能,然后这样传入:

    db.select('table_name').where('a = 1 AND b = 2')

    这样是不是更加简洁一些呢?
    lianghui
        4
    lianghui  
    OP
       2015-01-14 12:19:25 +08:00
    @mywaiting 关键是python db api规范参数预处理绑定比较蛋疼,那个如果需要参数转义反注入怎么办。 那种简单真的不如 db.query('SELECT * FROM tabel_name where a=%s and b=%s', (a, b))

    或者 db.select('table_name').condition('a', 1).condition('b', 2) 这样至少做会做转义防止sql注入
    lianghui
        5
    lianghui  
    OP
       2015-01-14 12:24:03 +08:00
    @mywaiting 附加: 那个and or 只是为了写比较复杂的and or组合,当然特别复杂的直接raw sql最好了。
    geew
        6
    geew  
       2015-01-14 14:23:10 +08:00
    这代码看着好php的感觉...难道是我的错觉么
    lianghui
        7
    lianghui  
    OP
       2015-01-14 14:25:19 +08:00
    @geew 借鉴了drupal的设计。
    Comdex
        8
    Comdex  
       2015-01-14 21:30:31 +08:00
    我对C++分布式群组聊天项目比较感兴趣
    stevegy
        9
    stevegy  
       2015-01-15 14:50:40 +08:00
    这个。。。为啥不用现成的sqlalchemy?
    lianghui
        10
    lianghui  
    OP
       2015-01-15 18:36:44 +08:00
    @Comdex 这个没成型,纯属意淫。
    lianghui
        11
    lianghui  
    OP
       2015-01-15 18:37:35 +08:00
    @stevegy 恩,sqlalchemy是个选择
    wingyiu
        12
    wingyiu  
       2015-01-18 17:28:24 +08:00
    建议看看peewee
    lianghui
        13
    lianghui  
    OP
       2015-01-18 20:25:33 +08:00
    @wingyiu 大概是一年半前看过这个库,那时好像还没有实现连接池。 这类是orm简单架构,dbpy是数据库访问层封装。 不过有个问题不知道又没考虑过,就是记录模型这类设计,如果需要切换nosql比如couchdb这类,是不是意味着很多东西需要重写?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:45 · PVG 03:45 · LAX 12:45 · JFK 15:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.