que:sneks的sql

que-p的Python项目详细描述


que:SNEKS的SQL

imageimageimageimageimagecodecov

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进行规范化,以便 初始化INSERTUPDATE在功能上与 初始化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())

文档

即将提供完整的文档!

愉快的查询

如何贡献

  1. 检查未解决的问题或打开新问题以开始讨论 围绕一个功能想法或一个bug。
  2. 在github上为您的问题或fork创建分支 the repository在github上 开始对master分支进行更改。
  3. 编写一个测试,显示错误已被修复或功能 按预期工作。
  4. 发送一个pull请求并对维护程序进行bug操作,直到它被合并并 出版。:)

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

推荐PyPI第三方库


热门话题
java从提供的列表中获取非重复值   java为什么Thymeleaf从HashMap返回字符串?   java将矩阵推到窗口的中心   java如何包含webapp_配置。txt到播放的dist-zip?   java实现产品密钥   WebSphereJava。lang.UnsupportedClassVersionError:JVMCFRE003错误的主要版本;class=org/slf4j/impl/StaticLoggerBinder,偏移量=6   使用java创建动态树结构   java为什么JVM在一次繁忙的旋转暂停后,会对同一代码块显示更多的延迟?   java无法使用distrolessdebug访问jarfile docker   java JMeter如何将多行响应数据传递给ForEach控制器请求   java空指针异常碎片活动   java改变JFileChooser的外观   性能Java位集:高效地查找所有真实位?   java可扩展的recyclerview实现