【发布时间】:2019-04-29 08:37:31
【问题描述】:
我正在使用psycopg2 与PostgreSQL 数据库进行交互。我有一个函数可以插入表中的任意数量的列(从单列到所有列)。我的问题是:如何正确、动态地构造这个查询?
目前我正在使用字符串格式和连接,我知道这是绝对最糟糕的方法。考虑下面的代码,在这种情况下,我未知的列数(即来自 dict 的键实际上是 2):
dictOfUnknownLength = {'key1': 3, 'key2': 'myString'}
def createMyQuery(user_ids, dictOfUnknownLength):
fields, values = list(), list()
for key, val in dictOfUnknownLength.items():
fields.append(key)
values.append(val)
fields = str(fields).replace('[', '(').replace(']', ')').replace("'", "")
values = str(values).replace('[', '(').replace(']', ')')
query = f"INSERT INTO myTable {fields} VALUES {values} RETURNING someValue;"
query = INSERT INTO myTable (key1, key2) VALUES (3, 'myString') RETURNING someValue;
这提供了格式正确的查询,但当然容易受到 SQL 注入等的影响,因此,这不是实现我的目标的可接受方法。
在其他查询中,我在处理已知数量的变量(%s 和包含变量的 .execute() 的单独参数)时使用查询构造的 recommended 方法,但我不确定如何调整它以适应不使用字符串格式的未知数量的变量。
我怎样才能优雅地安全地构造一个包含未知数量的指定插入列的查询?
【问题讨论】:
标签: python sql python-3.x postgresql psycopg2