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

2024-05-16 17:50:22 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上是尝试创建ISNERT函数,它将编译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()

返回给我:

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

Tags: 函数selfdefresquerykwargsinsertvalues
2条回答

qms数组已用字符串值“%s”填充。 然后,qmarks字符串等于“%s,%s”。 然后,将该值注入查询字符串两次,这样就可以“插入用户(%s,%s)值(%s,%s)”。 这里的问题是您用不正确的值填充了数组。 您需要插入表名和值,而不是%s

psycopg2的execute()函数只注入值,而不注入列,您需要传递真实的列名以进行查询:

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)'

相关问题 更多 >