如何在BigQuery SQL中安全地参数化表/列的名称?

问题描述 投票:0回答:1

我正在使用python的BigQuery客户端在BigQuery中创建和更新某些表,这些表包含某些火力事件的每日计数以及其他来源的数据(有时按国家/地区分组)。要使它们保持最新状态,就需要删除和替换过去几天的数据,因为Firebase事件的日表可以在创建后进行更改(请参阅herehere)。我以这种方式使它们保持最新状态,以避免查询整个财务/计算成本很高的数据集。

此删除和替换过程需要在许多表中重复进行,因此,我需要重用一些存储在文本文件中的查询。例如,从特定日期开始删除表中的所有内容(delete from x where event_date >= y)。但是由于BigQuery不允许对表名进行参数化(请参阅here),因此我必须为每个表复制这些查询文本文件。如果我想运行测试,我也必须对测试表重复上述查询。

对于bigquery,我基本上需要类似psycopg2.sql的东西,以便我可以安全地参数化表和列名,同时避免使用SQLi。我实际上试图通过调用as_string()方法并使用结果查询BigQuery来重新利用此模块。但是结果语法不匹配,我需要启动一个postgres连接来完成它(as_string()需要一个游标/连接对象)。我也尝试了与sqlalchemy.text类似的操作,但无济于事。所以我得出结论,我基本上必须自己实现某种参数化表名的方法,或者使用python客户端库实现一些解决方法。关于如何以一种不会导致SQLi的安全方式进行此操作的任何想法?无法详细介绍,但是很遗憾,我无法将表存储在postgres或任何其他数据库中。

python sql google-bigquery prepared-statement sql-injection
1个回答
0
投票
如果仍然需要/想要在构建查询之前解析输入参数,建议您使用REGEX来检查输入字符串。在Python中,您可以使用re库。
© www.soinside.com 2019 - 2024. All rights reserved.