datalab github repo中的“SQL Parameters”IPython笔记本中的参数化示例(在datalab / tutorials / BigQuery /下)显示了如何在WHERE子句中更改正在测试的值。
%%sql --module get_data
SELECT *
FROM
[myproject:mydataset.mytable]
WHERE
$query
但是,此语法似乎总是在参数周围插入引号。当我传递的参数不仅仅是一个简单的值时,这会中断:
import gcp.bigquery as bq
query = "(bnf_code LIKE '1202%') OR (bnf_code LIKE '1203%')"
query = bq.Query(get_data, query=query)
print query.sql
这会打印一个无效的查询:
SELECT * FROM [myproject:mydataset.mytable]
WHERE "(bnf_code LIKE '1202%') OR (bnf_code LIKE '1203%')"
有什么方法可以插入未用引号括起来的值吗?
我在我的代码中重复使用该模块,在查询参数中包含可变数量的OR子句。所以我确实需要一种方法来传递更复杂的查询。
答案 0 :(得分:2)
抱歉,变量应该是简单的标量,表格或(很快)列表,用于IN子句。它们不适用于表达。
答案 1 :(得分:2)
不可能将不带引号的参数传递给SQL modules ,但可以使用字符串形式的直接SQL创建import datalab.data._sql_statement as bqsql
statement = bqsql.SqlStatement(
"SELECT some-field FROM %s" % '[your-instance:some-table-name]')
query = bq.Query(statement)
。有了它,您可以使用自己的Python样式占位符来替换您认为合适的值:
statusHints
我不知道他们是否对占位符或笔记本中的命令处理做了什么特别的事情,但是......好吧,我没有看到任何这些(我承认有限的)洞穴探险。