完全简单的RDBMS处理库

dsql的Python项目详细描述


dead简单rdbms处理库

https://github.com/gwn/dsql

死简单的SQL生成和结果处理库。设计用于 python db api 2兼容的数据库连接对象。

安装时使用:

pip install dsql

您可以通过两种方式使用dsql。第一种情况是生成SQL语句:

>>> from dsql import buildquery

>>> buildquery('select',
               'people',
               ['name', 'surname'],
               where=[{'age >': 30}],
               orderby='-age',
               dialect='postgresql')

(
    'SELECT "name", "surname" FROM "people" WHERE "age" > %s ORDER BY "age" DESC',
    [30]
)

第二个用例是创建一个manager对象,除了生成 您的语句,自动执行它们并为您处理结果:

>>> import psycopg2
>>> from psycopg2.extras import DictCursor
>>> from dsql import makemanager

>>> conn = psycopg2.connect(database='foo', cursor_factory=DictCursor)

>>> db = dsql.makemanager(conn, dialect='postgresql')

>>> itemiter = db.select('products', where=[{'color =': 'red'}])

>>> itemiter.next()
{
    'id': 1,
    'title': 'Shirt',
    'color': 'red'
}

>>> db.insert('products', [{'title': 'Pants', 'color': 'green'},
>>>                        {'title': 'Socks', 'color': 'yellow'}])
[2, 3]

注意需要配置连接以返回dictcursors 而不是标准游标,如上例所示。

查看下面的参考部分,以获取整个api的文档。

安装

pip install dsql

引用

退房:

# Query Builder

query, params = dsql.buildquery(operation, tablename,
                                <depends-on-the-operation>, ...
                                dialect='standard')

query, params = dsql.buildquery('select', tablename, fieldlist=[],
                                where=[], groupby=[], having=[],
                                orderby=[], limit=0, offset=0,
                                dialect='standard')

query, params = dsql.buildquery('insert', tablename, recordlist,
                                dialect='standard')

query, params = dsql.buildquery('update', tablename, updates, where=[],
                                orderby=[], limit=0, offset=0,
                                dialect='standard')

query, params = dsql.buildquery('delete', tablename, where=[], orderby=[],
                                dialect='standard')

query, params = dsql.buildquery('raw', query, params)


# Manager

db = dsql.makemanager(dbapi2_compatible_connection_object,
                      dialect='standard')

itemiter = db.select(tablename, fieldlist=[], where=[], groupby=[],
                     having=[], orderby=[], limit=1, offset=0, commit=True,
                     dry_run=False, response_handler=None)

list_of_inserted_ids = db.insert(tablename, recordlist, commit=True,
                                 dry_run=False, response_handler=None)

number_of_affected_rows = db.update(tablename, updates, where=[],
                                    orderby=[], limit=0, offset=0,
                                    commit=True, dry_run=False,
                                    response_handler=None)

number_of_affected_rows = db.delete(tablename, where=[], orderby=[],
                                    commit=True, dry_run=False,
                                    response_handler=None)

mixed = db.raw(query, params, commit=True, dry_run=False,
               response_handler=None)
# return value of this one depends on the type of query.

related_connection_object = db.conn

通用参数文档:

fieldlist

字段列表,如['name','age','occulation']。传递空列表,或 全部跳过,得到所有字段。

其中

条件组列表。

每个条件组都是谓词和值对的dict,例如:{name =':'约翰','年龄>;':30}。每一对都与组合在一起,因此这个例子是 翻译成模板“name”=%s和“age”>; %s['john',30]的值。

条件组本身与组合,因此下面的其中 表达式:

[{'name =': 'John', 'age >': 30}, {'occupation in': ['engineer', 'artist']}]

翻译成:

WHERE ("name" = %s AND age > %s) OR (occupation IN (%s, %s))

值为:['john',30,'engineer','artist']

所有标准比较运算符以及likenot likeinnot 支持in

如果需要构造更复杂的筛选器,请尝试原始查询。

groupby

组字段列表,如['age','occulation']

具有

中的相同。

orderby

要排序依据的字段列表。将-前缀添加到要降序的字段名中 命令。示例:['age','-net_worth']

限制

限制为整数,例如50

偏移量

偏移为整数,例如200

方言

标准PostgreSQLMySQL

commit

自动提交查询。如果你选择不承诺,你总能得到 来自manager对象的连接对象(通过manager.conn)并使 当时机成熟的时候,你要承诺自己。

干运行

。如果为true,则不执行查询,而是将其转储到 检验的标准误差。

响应处理程序

默认情况下,manager对象为您处理响应。它返回一个 select调用的记录迭代器,insert的最后插入id的列表 调用,以及其他行的受影响行数。在你想处理的情况下 响应本身,您可以传递自己的响应处理程序 将是光标对象和当前方言。示例:

value_of_custom_handler = manager.select(tablename, limit=10,
                                         response_handler=custom_handler)

示例

带psycopg2的posgresql:

import psycopg2
import psycopg2.extras
import dsql

conn = psycopg2.connect(host='localhost', user='root', database='lorem',
                        cursor_factory=psycopg2.extras.DictCursor)

db = dsql.makemanager(conn, dialect='postgresql')

itemiter = db.select('products', ['id', 'name', 'description'])
item = itemiter.next()
print item['name']

...

mysql和mysqldb:

import MySQLdb
import MySQLdb.cursors
import dsql

conn = MySQLdb.connect(host='localhost', user='root', db='lorem',
                       cursorclass=MySQLdb.cursors.DictCursor)

db = dsql.makemanager(conn, dialect='mysql')

itemiter = db.select('products',
                     ['id', 'name', 'description'],
                     where=[{'status =': 'in stock'}])
item = itemiter.next()
print item['name']

last_insert_ids = db.insert('products',
                            [
                                {
                                   'name': 'foo',
                                   'description': 'what a product!',
                                }
                            ])

last_insert_ids = db.insert('products',
                            [
                               {
                                   'name': 'foo',
                                   'description': 'what a product!',
                               }
                            ],
                            commit=False)
db.conn.commit()

affected_rowcount = db.update('products',
                              {'name': 'lorem ipsum'},
                              where=[{'id =': 888}])

affected_rowcount = db.delete('products', where=[{'id =': 777}])

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将Scanner对象作为构造函数参数传递给UserInterface类   spring未能启动bean“subtocolWebSocketHandler”;嵌套的例外是java。lang.IllegalArgumentException:没有处理程序   Java EE应用程序中后台服务的多线程Java线程(设置守护进程和优先级)?   java Pull to refresh返回列表的第一个位置   无法将comparator类转换为java。可比的   java将json从servlet传递到dojo   JavaHibernate:将子类实例转换为超类实例   java警告调用servlet类时非法反射访问   java静态变量值   java@Entity和@embeddeble之间有什么区别   java将作业配置导入公共作业配置类(注释配置)   sql公共表表达式(以values语句开头)在java中给出错误   java在ImageJ中使用ImageProcessor   java PostgreSQL executeBatch()会随着时间的推移而变慢   java在安卓中以表格形式排列sqllite表数据?   java中SVG的swing定制呈现   java删除与另一个实体映射的实体   java何时/如何添加ListView适配器,使用back按钮恢复它?(片段)   java为什么IBinder和Binder之间的类型转换不是非法的?   java在方法参数列表中使用ArrayList或List