Python 3.x Psycopg2在动态生成的SQL上引发语法错误
因此,我有以下代码段,其中我试图为insert生成一个动态SQL,下面是作为有效负载传递的有效负载Python 3.x Psycopg2在动态生成的SQL上引发语法错误,python-3.x,psycopg2,Python 3.x,Psycopg2,因此,我有以下代码段,其中我试图为insert生成一个动态SQL,下面是作为有效负载传递的有效负载 data={“id”:“123”,“name”:“dev”,“description”:“This is the dev Env”,“created_by”:“me”,“updated_by”:“me”,“table_name”:table_name} 我得到了上述有效载荷的以下错误 第1行:…更新了\u by,表名)值(123,dev,这是dev En。。。 我的实施: class DMLR
data={“id”:“123”,“name”:“dev”,“description”:“This is the dev Env”,“created_by”:“me”,“updated_by”:“me”,“table_name”:table_name}
我得到了上述有效载荷的以下错误
第1行:…更新了\u by,表名)值(123,dev,这是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 DB,而不首先引用它们。就我个人而言,我会引用将进入数据库的所有数据,以确保正确处理 您可以执行以下操作:
placeholders = ", ".join([f'"{val}"' for val in converted_dict['values']])
如果您有不同类型的数据,例如datetimes,那么字符串表示将放在f字符串中,因此它是安全的
如果您的字符串包含双引号,为了安全起见,可以使用“美元报价”:
placeholders = ", ".join([f'$${val}$$' for val in converted_dict['values']])
如果你认为你的某根绳子可能会一根接一根地扣上两美元,那么在这两美元之间放上一根绳子,以确保安全:
placeholders = ", ".join([f'$str${val}$str$' for val in converted_dict['values']])
这样做的缺点是,您会增加传输的数据量,如果您有大量信息,则会降低性能。问题是,您试图将字符串值传递到postgres DB,而不首先引用它们。我个人会引用将进入数据库的所有数据,以确保e确保它被正确处理 您可以执行以下操作:
placeholders = ", ".join([f'"{val}"' for val in converted_dict['values']])
如果您有不同类型的数据,例如datetimes,那么字符串表示将放在f字符串中,因此它是安全的
如果您的字符串包含双引号,为了安全起见,可以使用“美元报价”:
placeholders = ", ".join([f'$${val}$$' for val in converted_dict['values']])
如果你认为你的某根绳子可能会一根接一根地扣上两美元,那么在这两美元之间放上一根绳子,以确保安全:
placeholders = ", ".join([f'$str${val}$str$' for val in converted_dict['values']])
这样做的缺点是,您增加了传输的数据量,如果您有大量信息,则会降低性能。字符串中是否缺少
“
”?是的,确实如此,但我不知道为什么不使用占位符=“,”.join([f'{val})来处理它“'for val in converted_dict['values']])
这不会将所有内容都转换为字符串吗?是的,但这对SQL来说不是问题。它会检查列的类型并正确保存数据。字符串中是否缺少了”
?是的,就是这样,但我不知道为什么不使用占位符=”,“.join([f''{val}'表示转换后的[u dict['values']]中的val)
这不会将所有内容都转换为字符串吗?是的,但这对SQL来说不是问题。它会检查列的类型并正确保存数据