psycpg2 Вставить в неудачи - PullRequest
0 голосов
/ 09 марта 2020

Я получил некоторый код python (psycopg2), с которым следует вставлять данные в базу данных:

def debug(self):
    try:

        self.connection.execute(
            "SELECT test();")
        res = self.connection.fetchall()
        print(res)

    except Exception as e:
        print(e)
    return

Функция test () в pg sql выглядит так:

CREATE OR REPLACE FUNCTION test(
) RETURNS setof varchar
AS $Body$
BEGIN
    INSERT INTO Linie(name) VALUES('3');
    RETURN QUERY(SELECT * FROM linie);
END;
$Body$ LANGUAGE plpgsql;

Когда я изменяю значение "name" и выполняю запрос в pgAdmin, в базе данных теперь есть запись. Однако при вызове функции из python она всегда переопределяет значение.

Таблица определяется следующим образом:

CREATE TABLE Linie(
name varchar,
PRIMARY KEY (name)
);

Например, с помощью pgAdmin я могу вставить 1,2,3, 4,5. С python после выполнения 5 эквивалентных запросов это просто 5.

Вызов функции теста с помощью nodeJS работает нормально.

При вызове функции один раз из python и изменении вставки value, а затем снова вызывая его из python, значения не заменяются, а вставляются.

Кроме того, он не выдает никаких ошибок и возвращает таблицу, как следует (кроме замененного значения). почему это происходит и что я могу сделать против этого?

1 Ответ

0 голосов
/ 10 марта 2020

Psycopg2 по умолчанию не будет вносить изменения, внесенные в базу данных, если вы явно не вызовете connection.commit() после выполнения SQL. Вы можете изменить свой код следующим образом:

def debug(self):
    try:
        self.connection.execute(
            "SELECT test();")
        res = self.connection.fetchall()
        self.connection.commit()
        print(res)
    except Exception as e:
        print(e)
    return

Однако, пожалуйста, будьте осторожны, поскольку у меня нет информации о том, что именно является экземпляром self.connection, поэтому я предположил, что он имеет тип connection :) В качестве альтернативы, когда вы устанавливаете соединение с БД, задайте для свойства autocommit значение True, , как описано здесь. Пример:

self.connection = psycopg2.connect(user='foo', password='bar', host='localhost', dbname='mydb')
self.connection.autocommit = True

Если вы уже использую autocommit, дайте мне знать, и я еще раз посмотрю на ваш вопрос.

...