用于编写可组合SQL查询的简单库

csql的Python项目详细描述


csql-可组合SQL

csql是一个Python库,可以帮助您编写更易于管理的SQL查询。您可以将查询编写为独立的小块,预览结果而不必从数据库中提取整个结果集,然后在以后的查询中引用它们。在

对于正确处理数据库参数,还有一些有用的特性。在

预期的用例用于数据分析和探索。在

PyPI version

示例:

fromcsqlimportQ,Parametersimportpandasaspdfromdatetimeimportdatecon=your_database_connection()

从一个简单的查询开始:

^{pr2}$
idnamecreated_onsales
1111John Smith2020-02-0532.0
2112Amy Zhang2020-05-01101.5
3115Tran Thanh2020-03-02100000.0

预览将下拉10行,以a)检查您刚刚编写的内容的结果,以及b)验证您的sql。在


现在,尝试构建一些新的查询,这些查询是在以前的查询基础上构建的:

q2=Q(f"""select	ntile(100) over (order by sales)		as ntile_100,	name,	salesfrom {q1}""")print(q2.preview_pd(con))
^{tb2}$
q3=Q(f"""select	ntile_100,	min(sales),	max(sales)from {q2}group by ntile_100order by ntile_100""")# this time, we'll pull the whole result instead of just previewing:result=pd.read_sql(**q3.pd(),con=con)print(result)
ntile_100min(sales)max(sales)
28292533.3
495098120
98995004100000.0

酷!但是,它是如何工作的?在

基本思想是通过跟踪在什么基础上构建什么,将查询转换为CTE。例如,对于显示的最后一个查询q3,实际发送到数据库的内容是:

with_subQuery0as(selectcustomers.id,first(customers.name)asname,first(created_on)ascreated_on,sum(sales.value)assalesfromcustomersjoinsalesoncustomers.id=sales.customer_idwherecreated_on>:1groupbycustomers.id),_subQuery1as(selectntile(100)over(orderbysales)asntile_100,name,salesfrom{q1})selectntile_100,min(sales),max(sales)from{q2}groupbyntile_100orderbyntile_100

这正是这个库旨在帮助您避免的那种无法维护和不可调试的怪物。在

设计说明:

我可能对此过于乐观,但目前我认为这应该适用于大多数SQL方言。它不尝试解析您的SQL,使用广泛支持的cte,并传递数字样式参数。 实际上,它根本没有与pandas联系在一起,.pd()只是一种方便的方法,可以用来构建dictpd.read_sql语句. 在

TODO/未来实验:

  • 记录API(目前,只需阅读测试)
  • 实现pandas(需要输入)以外的其他预览系统!什么对你有用?)在
  • 最终确定API,使其尽可能符合人机工程学,便于交互使用(需要输入!)在
  • 实现一些实际存储先前结果的方法,例如,放入临时表中。(哦,这需要数据库特定的意识:()

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

推荐PyPI第三方库


热门话题
java是否存在这样一种场景:Java7的Hashmap实现优于Java8的实现   java如何打印这些完整的数组?   java BuildException:未能执行aapt   java如何使用类。未知类型的集合返回的cast()   java准备语句返回错误的值   webview 安卓中的java显示身份验证对话框   java如何重命名列名JPA Hibernate   java查询从特定用户和特定时间段的Oracle表(通过比较原始表和备份表)中选择修改的行   java Youtube视频仅在三星S6设备上加载时自动暂停   未调用java RecyclerView getItemViewType   使用JSch setCommand执行带有源选项的java Shell ping命令时失败   java Hibernate:无法删除|删除分离的实例   Java Spring@MappedSuperclass字段作为子类中的@Id字段   java Android:确定单击了哪个按钮,因为该按钮未在xml中定义   如何计算java阵列内存使用率   使用Java查找按字母顺序排列的第一个字符串   javascript注销功能刷新页面,但页面仍已登录   当接口作为参数提供时,java依赖项注入不起作用   java中带原语的字符串扭曲