#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. Спасибо за безумно быстрый и полезный ответ!