如何修复“%”处或附近的 psycopg2 语法错误?

How to fix the psycopg2 syntax error at or near '%'?

基本上是尝试创建 INSERT 函数,它将编译插入并执行它。

def Insert(self,tablename, **kwargs):
        qms = []
        for idx, item in enumerate(kwargs):
            qms.append('%%s')
        qmarks = ', '.join(qms)
        res = []
        res.extend(kwargs.keys())
        res.extend(kwargs.values())
        res = tuple(res)
        QUERY = "INSERT INTO "+tablename+" (%s) VALUES (%s)" % (qmarks, qmarks)
        self.dc.execute(QUERY, res)
        self.db.commit()

Returns我:

psycopg2.errors.SyntaxError: syntax error at or near "%"
LINE 1: INSERT INTO users (%s, %s) VALUES (%s, %s)

您的 qms 数组中填充了字符串值“%s”。 那么您的 qmarks 字符串等于“%s,%s”。 之后,您将该值注入查询字符串两次,这样您就有了 'INSERT INTO users (%s, %s) VALUES (%s, %s)'。 这里的问题是您用不正确的值填充了数组。 您需要注入您的 table 名称和值而不是 %s

psycopg2 的 execute() 函数只注入值 而不是 列,您需要将真实的列名传递给 QUERY:

import psycopg2
import psycopg2.extras


class A():
    def __init__(self):
        self.dc = ...
        self.db = ...

    def Insert(self, tablename, **kwargs):
        columns = []
        valuePlaceholders = []
        values = []
        for column, value in kwargs.items():
            columns.append(column)
            valuePlaceholders.append('%%s')
            values.append(value)

        QUERY = "INSERT INTO " + tablename + " (%s) VALUES (%s)" % (', '.join(columns), ', '.join(valuePlaceholders))
        print(self.db.mogrify(QUERY, values))
        #self.db.execute(QUERY, values)
        #self.db.commit()


a = A().Insert('foo', arg1="bar", arg2="test")

输出:

b'INSERT INTO foo (arg1, arg2) VALUES (%s, %s)'