我有以下代码,使用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
噜噜哒
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")})
- 3 回答
- 0 关注
- 1096 浏览
添加回答
举报
0/150
提交
取消