Как исправить синтаксическую ошибку psycopg2 в или около '%'? - PullRequest
1 голос
/ 06 января 2020

В основном пытается создать функцию ISNERT, которая скомпилирует вставку и выполнит ее.

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)

Ответы [ 2 ]

2 голосов
/ 06 января 2020
Функция

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)'
0 голосов
/ 06 января 2020

Ваш массив qms заполнен строковыми значениями "% s". Ваша строка qmarks тогда равна "% s,% s". После этого вы вводите это значение в строку запроса дважды, чтобы у вас было «INSERT INTO users (% s,% s) VALUES (% s,% s)». Проблема в том, что вы заполнили свой массив неверными значениями. Вам нужно ввести имена и значения таблиц вместо% s

...