用于编写可组合SQL查询的简单库
csql的Python项目详细描述
csql-可组合SQL
csql是一个Python库,可以帮助您编写更易于管理的SQL查询。您可以将查询编写为独立的小块,预览结果而不必从数据库中提取整个结果集,然后在以后的查询中引用它们。在
对于正确处理数据库参数,还有一些有用的特性。在
预期的用例用于数据分析和探索。在
示例:
fromcsqlimportQ,Parametersimportpandasaspdfromdatetimeimportdatecon=your_database_connection()
从一个简单的查询开始:
^{pr2}$id | name | created_on | sales | |
---|---|---|---|---|
1 | 111 | John Smith | 2020-02-05 | 32.0 |
2 | 112 | Amy Zhang | 2020-05-01 | 101.5 |
3 | 115 | Tran Thanh | 2020-03-02 | 100000.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_100 | min(sales) | max(sales) | |
---|---|---|---|
28 | 29 | 25 | 33.3 |
49 | 50 | 98 | 120 |
98 | 99 | 5004 | 100000.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,使其尽可能符合人机工程学,便于交互使用(需要输入!)在
- 实现一些实际存储先前结果的方法,例如,放入临时表中。(哦,这需要数据库特定的意识:()
- 项目
标签: