Python 3.x Psycopg2在动态生成的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

因此,我有以下代码段,其中我试图为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 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来说不是问题。它会检查列的类型并正确保存数据