que:sneks的sql
que-p的Python项目详细描述
que:SNEKS的SQL
que允许您动态生成sql查询,而不需要 一只羽翼丰满的虫子的头顶。
动机
que的诞生是因为需要为asgi web动态生成sql 服务。我发现自己希望能够方便地进行动态查询 使用ORM,例如sqlalchemy,但是 异步数据库客户端。奎试图填补这一空白。选择 您更喜欢的连接客户机,让que担心sql。
这是什么?
que只解决一个问题:在 纯Python。奎绝对没有严格的依赖,也没有 强制使用特定的数据库客户端或方言。
是否仍要使用sqlalchemy进行连接?去争取吧。想要使用 pymysql还是psycopg2?奎不会阻止你的。要使用异步 像aiopg这样的框架?你真有品位!这个图书馆 专为你写的。
设计
que的重点是simplicity,看看
简单的SELECT
:
>>>importque>>>select=que.Select(table='foo')>>>selectSelect(table='foo',schema=None,filters=FilterList([]),fields=FieldList([]))>>>sql,args=select.to_sql()>>>print(sql)SELECT*FROMfoo
que通过参数化sql与您选择的dbapi客户机一起工作。 为您格式化参数:
>>>importque>>>fields=[que.Field('bar')]>>>filters=[que.Filter(que.Field('id',1))]>>>select=que.Select(table='foo',filters=filters,fields=fields)>>>sql,args=select.to_sql()>>>print(sql)SELECTbarFROMfooWHEREid=:1>>>args[1]>>>sql,args=select.to_sql(style=que.NameParamStyle.NAME)>>>print(sql)SELECTbarFROMfooWHEREid=:id>>>args{'id':1}
que可以对sql操作的api进行规范化,以便
初始化INSERT
或UPDATE
在功能上与
初始化SELECT
:
>>>importque>>>importdataclasses>>>importdatetime>>>>>>@dataclasses.dataclass...classFoo:...bar:str...id:int=None...created:datetime.datetime=None...>>>new_foo=Foo('blah')>>>fields=que.data_to_fields(new_foo,exclude=None)>>>insert=que.Insert(table='foo',fields=fields)>>>sql,args=insert.to_sql(que.NameParamStyle.NAME)>>>print(sql)INSERTINTOfoo(:colbar)VALUES(:valbar)>>>args{'colbar':'bar','valbar':'blah'}
快速启动
que没有依赖性,而且非常轻(目前 只有约30kb!),只有几百行代码。 安装非常简单。
那你就可以走了!import que
和摇滚
示例
生成SQL并插入新条目的简单客户端:
importdataclassesimportsqlite3importque@dataclasses.dataclassclassSpam:flavor:strid:int=Nonecreated_on:int=NoneclassSpamClient:"""A database client for tracking spam flavors."""def__init__(self):self.conn=sqlite3.connect('sqlite://spam.db')definsert_spam(self,spam:Spam):fields=que.data_to_fields(spam,exclude=None)insert=que.Insert('spam',fields=fields)sql,args=insert.to_sql()returnself.conn.execute(sql,args)defget_spam(self,**kwargs):fields=que.data_to_fields(kwargs)filters=[que.Filter(x)forxinfields]select=que.Select('spam',filters=filters)returnself.conn.execute(*select.to_sql())defupdate_spam(self,spam:Spam):fields=[que.Field('flavor',spam.flavor)]filters=[que.Filter(que.Field('id',spam.id))]update=que.Update('spam',filters=filters,fields=fields)returnself.conn.execute(*update.to_sql())defdelete_spam(self,spam:Spam):filters=[que.Filter(que.Field('id',spam.id))]delete=que.Delete('spam',filters=filters)returnself.conn.execute(*delete.to_sql())
文档
即将提供完整的文档!
愉快的查询
如何贡献
- 检查未解决的问题或打开新问题以开始讨论 围绕一个功能想法或一个bug。
- 在github上为您的问题或fork创建分支 the repository在github上 开始对master分支进行更改。
- 编写一个测试,显示错误已被修复或功能 按预期工作。
- 发送一个pull请求并对维护程序进行bug操作,直到它被合并并 出版。:)