【发布时间】:2020-12-25 21:25:50
【问题描述】:
我有一个问题,我有一个字典列表,例如以下数据:
columns = [{
'name': 'column1',
'type': 'varchar'
},
{
'name': 'column2',
'type': 'decimal'
},
.
.
.
]
从该列表中,我需要根据列表中包含列名称和类型的每个字典动态创建 CREATE TABLE 语句,并使用 psycopg2 适配器在 PostgreSQL 数据库上执行它。
我设法做到了:
columns = "(" + ",\n".join(["{} {}".format(col['name'], col['type']) for col in columns]) + ")"
cursor.execute("CREATE TABLE some_table_name\n {}".format(columns))
但是这种解决方案容易受到 SQL 注入的影响。我试图用 psycopg2 的 sql 模块做同样的事情,但没有运气。总是出现语法错误,因为它将类型括在引号中。
有什么方法可以安全地做到这一点吗?
【问题讨论】:
-
你能用
psycopg2.sql发布你的尝试吗? -
'columns' 有取消引号的字符串:是故意的吗?
-
没有时间看一个完整的例子,而是一个简单的例子:
print(sql.SQL('decimal').as_string(con)) decimal
标签: python sql-injection psycopg2