动态生成的 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']])

这样做的缺点是会增加传输的数据量,如果您有大量信息,则会降低性能。