为了账号安全,请及时绑定邮箱和手机立即绑定

在psycopg2中将表名作为参数传递

在psycopg2中将表名作为参数传递

精慕HU 2019-12-03 16:52:44
我有以下代码,使用pscyopg2:sql = 'select %s from %s where utctime > %s and utctime < %s order by utctime asc;'data = (dataItems, voyage, dateRangeLower, dateRangeUpper)rows = cur.mogrify(sql, data)输出:select 'waterTemp, airTemp, utctime' from 'ss2012_t02' where utctime > '2012-05-03T17:01:35+00:00'::timestamptz and utctime < '2012-05-01T17:01:35+00:00'::timestamptz order by utctime asc;当我执行此操作时,它会崩溃-这是可以理解的,因为表名周围的引号是非法的。有没有一种方法可以合法地将表名作为参数传递,或者我是否需要进行(明确警告)字符串连接,即:voyage = 'ss2012_t02'sql = 'select %s from ' + voyage + ' where utctime > %s and utctime < %s order by utctime asc;'为任何见识加油。
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

表名不能作为参数传递,但其他所有参数都可以。因此,表名应该在您的应用程序中进行硬编码(不要接受输入或使用程序外的任何东西作为名称)。您拥有的代码应对此起作用。


如果您有合理的理由使用外部表名称,请确保您不允许用户直接输入该名称。也许可以传递索引来选择表,或者可以通过其他方式查找表名。但是,您应该对此保持谨慎。之所以可行,是因为表名相对较少。找到一种验证表名的方法,您应该会很好。


可以执行类似的操作来查看表名称是否存在。这是参数化版本。只需确保执行此操作并在运行SQL代码之前验证输出即可。对此的部分想法来自此答案。


SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' and table_name=%s LIMIT 1


查看完整回答
反对 回复 2019-12-03
?
噜噜哒

TA贡献1784条经验 获得超7个赞

根据此答案,您可以这样做:


import psycopg2

from psycopg2.extensions import AsIs


#Create your connection and cursor...


cursor.execute("SELECT * FROM %(table)s", {"table": AsIs("my_awesome_table")})


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 1019 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信