AsyncPg的SqlAlchemy适配器
metapensiero.sqlalchemy.asyncpg的Python项目详细描述
author: Lele Gaifax contact: lele@metapensiero.it license: GNU General Public License version 3 or later
这是一个python 3包,从专有的Ytefas应用程序派生而来 实现通过asyncpg在 比asyncpgsa更干净的方式(当然,我有偏见):主要的区别在于 使用显式类型的参数占位符,以避免最初的the problem 促使我写这个包裹。
它发出带有prettifiedsql语句的DEBUG日志,并将参数解析为 实际的values,并提供了metapensiero.sqlalchemy.proxy的asyncpg变体 是ProxiedQuery。
典型用法
以下脚本:
importasynciofromdatetimeimportdateimportloggingimportsqlalchemyassafromasyncpgimportcreate_poolfromasyncpg.typesimportRangefrommetapensiero.sqlalchemyimportasyncpgassasyncpgasyncdefdml_tests(connection):sasyncpg_test=sa.Table('sasyncpg_test',sa.MetaData(),sa.Column('id',sa.types.Integer,primary_key=True),sa.Column('value',sa.types.Text),sa.Column('period',sa.dialects.postgresql.DATERANGE))value='First test'insert_stmt=sasyncpg_test.insert().values(id=1,value=value)awaitconnection.execute(insert_stmt)new_value='Second test'update_stmt=(sasyncpg_test.update().values(value=new_value,period=Range(date(2016,2,1),date(2016,3,1))).where(sasyncpg_test.c.id==1))awaitconnection.execute(update_stmt)select_stmt=(sa.select([sasyncpg_test.c.value]).where(sasyncpg_test.c.id==sa.bindparam('id')))forrowinawaitconnection.fetchall(select_stmt,named_args={'id':1}):print('Row:',row)single_row=(sa.select([sasyncpg_test]).where(sasyncpg_test.c.period.contains(date(2016,2,15))))print('Row:',awaitconnection.fetchone(single_row))asyncdefrun(loop):pool=awaitcreate_pool(database="test",loop=loop)asyncwithpool.acquire()asapgc:connection=sasyncpg.Connection(apgc)query=sa.select([sa.func.version()])result=awaitconnection.scalar(query)print("PostgreSQL version:",result)awaitconnection.execute('create table sasyncpg_test ('' id integer not null primary key,'' value text,'' period daterange)')try:awaitdml_tests(connection)finally:awaitconnection.execute('DROP TABLE sasyncpg_test')defmain():loop=asyncio.get_event_loop()loop.run_until_complete(run(loop))if__name__=='__main__':logging.basicConfig(level=logging.DEBUG)main()
生成如下内容:
DEBUG:asyncio:Using selector: EpollSelector DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Fetching scalar in transaction 9ddb60: SELECT version() AS version_1 DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Fetched value in 869 µsec PostgreSQL version: PostgreSQL 9.6.6 on x86_64-pc-linux-gnu, compiled by gcc (Debian 7.2.0-12) 7.2.1 20171025, 64-bit DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Executing in transaction 9ddb60: CREATE TABLE sasyncpg_test ( id integer NOT NULL PRIMARY KEY, value text, period daterange ) DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Execution took 97.1 msec DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Executing in transaction 9ddb60: INSERT INTO sasyncpg_test (id, value) VALUES (1::integer, 'First test'::text) DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Execution took 1.26 msec DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Executing in transaction 9ddb60: UPDATE sasyncpg_test SET value = 'Second test'::text, period = '[2016-02-01,2016-03-01)'::daterange WHERE sasyncpg_test.id = 1::integer DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Execution took 14.1 msec DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Fetching rows in transaction 9ddb60: SELECT sasyncpg_test.value FROM sasyncpg_test WHERE sasyncpg_test.id = 1::integer DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Fetched 1 records in 909 µsec Row: <Record value='Second test'> DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Fetching row in transaction 9ddb60: SELECT sasyncpg_test.id, sasyncpg_test.value, sasyncpg_test.period FROM sasyncpg_test WHERE sasyncpg_test.period @> datetime.date(2016, 2, 15)::date DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Fetched one record in 951 µsec Row: <Record id=1 value='Second test' period=<Range [datetime.date(2016, 2, 1), datetime.date(2016, 3, 1))>> DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Executing in transaction 9ddb60: DROP TABLE sasyncpg_test RESTRICT DEBUG:metapensiero.sqlalchemy.asyncpg.funcs:Execution took 12 msec
更改
0.1(2017-12-03)
- 独立软件包,在GPLv3下发布
0.0(未发布)
- 最初的努力。