подключен к контейнеру psql docker с помощью psycopg2, но не может читать или записывать

#python-3.x #postgresql #docker #psycopg2

#python-3.x #postgresql #docker #psycopg2

Вопрос:

Я пытаюсь запустить базу данных postgres в контейнере docker, запуская небольшую программу на Python с классом для вызова базы данных.

Когда я запускаю код с запросом, кажется, что он работает нормально, но не дает никаких результатов. Я вижу, что я на самом деле попал в базу данных, потому что одна из таблиц имеет ограничение id, что приводит к ошибке, когда я пытаюсь вставить что-то, что уже существует.

Использование базы данных из TablePlus работает нормально.

Код:

 import psycopg2


class postgres():
    def __init__(self, db="foo", user="bar", password='baz', host='127.0.0.1', port=5432):
        self.conn = psycopg2.connect(
            database=db, user=user, password=password, host=host, port=port)
        self.cur = self.conn.cursor()

    def query(self, query):
        self.cur.execute(query)

        # self.cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);")

    def close(self):
        self.cur.close()
        self.conn.close()


db = postgres()
db.query("INSERT INTO test (id) values('test2')")
db.close()
  

приводит к:
«»»
Обратная трассировка (последний последний вызов):
Файл «/Users/myname/projects/myproject/dataGathering/postgres.py «, строка 21, в
db.query(«ВСТАВИТЬ В тест (id) значения(‘test2’)»)
Файл «/Users/myname/projects/myproject/dataGathering/postgres.py «, строка 11, в запросе
self.cur.execute(запрос)
psycopg2.ошибки.Уникальное нарушение: повторяющееся значение ключа нарушает уникальное ограничение «id_pkey»
ПОДРОБНО: Ключ (id)=(тест) уже существует.
«»»

Вставка чего-либо без конфликтующего идентификатора не вызывает ошибки, но и не дает никаких результатов в базе данных. Запросы SELECT имеют ту же веру.

Ответ №1:

Вы не выполняете:

conn.commit()

Таким образом, ваши изменения не зафиксированы.

Отсюда:

https://www.psycopg.org/docs/connection.html

» закрыть()

Закройте соединение сейчас (а не всякий раз, когда выполняется del). С этого момента соединение будет недоступно; при попытке выполнения какой-либо операции с подключением будет выдана ошибка интерфейса. То же самое относится ко всем объектам cursor, пытающимся использовать соединение. Обратите внимание, что закрытие соединения без предварительной фиксации изменений приведет к тому, что все ожидающие изменения будут отброшены, как если бы был выполнен ОТКАТ (если только не был выбран другой уровень изоляции: см. set_isolation_level()).»

Комментарии:

1. Спасибо за безумно быстрый и полезный ответ!