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

我有以下代码,使用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;'

为任何见识加油。


精慕HU
浏览 1032回答 3
3回答

守候你守候我

表名不能作为参数传递,但其他所有参数都可以。因此,表名应该在您的应用程序中进行硬编码(不要接受输入或使用程序外的任何东西作为名称)。您拥有的代码应对此起作用。如果您有合理的理由使用外部表名称,请确保您不允许用户直接输入该名称。也许可以传递索引来选择表,或者可以通过其他方式查找表名。但是,您应该对此保持谨慎。之所以可行,是因为表名相对较少。找到一种验证表名的方法,您应该会很好。可以执行类似的操作来查看表名称是否存在。这是参数化版本。只需确保执行此操作并在运行SQL代码之前验证输出即可。对此的部分想法来自此答案。SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' and table_name=%s LIMIT 1

噜噜哒

根据此答案,您可以这样做:import psycopg2from psycopg2.extensions import AsIs#Create your connection and cursor...cursor.execute("SELECT * FROM %(table)s", {"table": AsIs("my_awesome_table")})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server