动态生成的 Psycopg2 抛出语法错误 SQL
Psycopg2 Throwing Syntax error over dynamically generated SQL
所以我有以下代码片段,我在其中尝试为插入生成动态 SQL,以下是我作为有效负载传递的有效负载。
data = {"id": "123", "name": "dev", "description": "This is the dev Env","created_by":"me","updated_by": "me","table_name": table_name}
我收到上述负载的以下错误。
LINE 1: ...updated_by, table_name) VALUES (123, dev, This is the dev En...
我的实现:
class DMLRelationalDB:
def __init__(self):
pass;
def insert_sql(self, params):
"""
:param params:
:return:
"""
converted_dict = self.__convert_params_to_columns_and_placeholders(params)
print(converted_dict)
column_names = ", ".join(converted_dict['columns'])
placeholders = ", ".join(converted_dict['values'])
table_name = params["table_name"]
statement = f"""INSERT INTO {table_name} ({column_names}) VALUES ({placeholders})"""
print(statement)
return statement
def __convert_params_to_columns_and_placeholders(self, items_dict):
"""
:param items_dict:
:return:
"""
columns = []
values = []
for key, value in items_dict.items():
columns.append(key)
values.append(value)
return {"columns": columns, "values": values}
问题是您试图将字符串值传递给您的 postgres 数据库而不先引用它们。就我个人而言,我会引用所有将进入数据库的数据,只是为了确保它被正确处理。
您可以做的是:
placeholders = ", ".join([f'"{val}"' for val in converted_dict['values']])
如果您有不同类型的数据,例如日期时间,字符串表示形式将放在 f 字符串中,这样会很安全。
如果您的字符串包含双引号,您可以使用“dollar-quoting”以确保安全:
placeholders = ", ".join([f'$${val}$$' for val in converted_dict['values']])
如果你认为你的某串有可能是一个接一个两块钱,那么在两块钱之间放一些绳子以使其绝对安全:
placeholders = ", ".join([f'$str${val}$str$' for val in converted_dict['values']])
这样做的缺点是会增加传输的数据量,如果您有大量信息,则会降低性能。
所以我有以下代码片段,我在其中尝试为插入生成动态 SQL,以下是我作为有效负载传递的有效负载。
data = {"id": "123", "name": "dev", "description": "This is the dev Env","created_by":"me","updated_by": "me","table_name": table_name}
我收到上述负载的以下错误。
LINE 1: ...updated_by, table_name) VALUES (123, dev, This is the dev En...
我的实现:
class DMLRelationalDB:
def __init__(self):
pass;
def insert_sql(self, params):
"""
:param params:
:return:
"""
converted_dict = self.__convert_params_to_columns_and_placeholders(params)
print(converted_dict)
column_names = ", ".join(converted_dict['columns'])
placeholders = ", ".join(converted_dict['values'])
table_name = params["table_name"]
statement = f"""INSERT INTO {table_name} ({column_names}) VALUES ({placeholders})"""
print(statement)
return statement
def __convert_params_to_columns_and_placeholders(self, items_dict):
"""
:param items_dict:
:return:
"""
columns = []
values = []
for key, value in items_dict.items():
columns.append(key)
values.append(value)
return {"columns": columns, "values": values}
问题是您试图将字符串值传递给您的 postgres 数据库而不先引用它们。就我个人而言,我会引用所有将进入数据库的数据,只是为了确保它被正确处理。
您可以做的是:
placeholders = ", ".join([f'"{val}"' for val in converted_dict['values']])
如果您有不同类型的数据,例如日期时间,字符串表示形式将放在 f 字符串中,这样会很安全。
如果您的字符串包含双引号,您可以使用“dollar-quoting”以确保安全:
placeholders = ", ".join([f'$${val}$$' for val in converted_dict['values']])
如果你认为你的某串有可能是一个接一个两块钱,那么在两块钱之间放一些绳子以使其绝对安全:
placeholders = ", ".join([f'$str${val}$str$' for val in converted_dict['values']])
这样做的缺点是会增加传输的数据量,如果您有大量信息,则会降低性能。