Bigquery for sqlalchemy
sqlalchemy_bigquer的Python项目详细描述
bigquery实现了一个类似于sql的dsl,但有一些特殊之处:
- 它有一个“group each by”提示,用于对大量数据进行分组
- 当在一个大于少量兆字节的表上进行连接时,需要使用“join each…on”表单。
- 不能引用列,但可以引用表。但可能不是表别名。
- 因为不能引用列,所以只能使用不带空格的列,只能使用带下划线的字母数字字符,并且只能以字母或下划线开头的列
前两个问题(用于分组和联接的非标准“each”修饰符)尚未解决。bigquery将何时识别表对于某些操作来说太大的责任推给您,并在您想要使用这些修饰符时将负担转移到您身上。有时候你需要它们,有时候你不需要。把这个作为练习留给用户,让他们用字符串替换这个方言返回的内容。
用法
当前不支持使用sqlalchemy连接到 大查询。目前只支持生成要发送的sql 在定期的服务电话中。
要安装:
pip install sqlalchemy-bigquery
用法示例:
>>> import sqlalchemy.sql as sql >>> >>> from sqlalchemy import func >>> import sqlalchemy_bigquery.base as bq >>> >>> >>> country = sql.column("country") >>> fruit_type = sql.column("fruit_type") >>> calories = sql.column("calories") >>> total_usa = func.sum( ... sql.case( ... [(country == "usa", 1)], ... else_=0 ... ) ... ).label("Total_in_USA") >>> total_japan = func.sum( ... sql.case( ... [(country == "japan", 1)], ... else_=0 ... ) ... ).label("Total_in_Japan") >>> s = sql.select([ ... fruit_type, ... total_usa, ... total_japan, ... ]).select_from(sql.table("fruit.table") ... ).group_by( ... fruit_type ... ).compile( ... compile_kwargs={"literal_binds": True}, ... dialect=bq.BQDialect() ... ) >>> print str(s) SELECT fruit_type, sum(CASE WHEN (country = 'usa') THEN 1 ELSE 0 END) AS Total_in_USA, sum(CASE WHEN (country = 'japan') THEN 1 ELSE 0 END) AS Total_in_Japan FROM [fruit.table] GROUP BY fruit_type