Вставка Psycopg2 не сохранена

Копия базы данных, о которой я не знал, прослушивала порт по умолчанию 5432, через который происходили вставки. Я должен передать пользовательский порт для БД, к которой я должен был подключиться.


Кое-что, что я думаю, может быть важным: идентификатор, возвращаемый из fetchall(), отличается от того, который фактически вставляется непосредственно из psql.

Сценарий, который я выполняю:

import os
import psycopg2

conn_config = {
    'host': os.environ['DB_HOST'],
    'dbname': os.environ['DB_NAME'],
    'user': os.environ['DB_USER'],
    'password': os.environ['DB_PASSWD']
}
conn = psycopg2.connect(**conn_config)
cur = conn.cursor()
sql = """INSERT INTO file(file_title, file_descrip) VALUES ('test','giannis') RETURNING file_id;"""
cur.execute(sql)
print(cur.fetchall())
conn.commit()
cur.close()
conn.close()

Выход:

>>>[(76,)]

Подключение с теми же учетными данными, с той же машины к БД:

select * from file where file.file_id=76;
 file_id | file_title | file_stream | file_descrip | obj_uuid
---------+------------+-------------+--------------+----------
(0 rows)

И из того же сеанса в psql, скопировав приведенный выше оператор SQL:

INSERT INTO file(file_title, file_descrip) VALUES ('test','giannis') RETURNING file_id;
 file_id
---------
      57
(1 row)

INSERT 0 1
my_db=> select * from file where file.file_id=57;
-[ RECORD 1 ]+-------------------------------------
file_id      | 57
file_title   | test
file_stream  |
file_descrip | giannis
obj_uuid     | 396d5d3b-efe1-422a-a6b4-d9b21381d4be

person Giannis    schedule 11.02.2017    source источник
comment
Что, если вы сделаете returning * вместо returning id?   -  person Clodoaldo Neto    schedule 12.02.2017
comment
Он возвращает правильный, полный объект, но все еще не в БД. Я полностью изменю текст вопроса, чтобы он имел гораздо более простой пример.   -  person Giannis    schedule 12.02.2017


Ответы (1)


Похоже, вы не совершаете транзакцию. Позвоните conn.commit() до закрытия соединения.

person hoyland    schedule 11.02.2017
comment
Я думал, что это делается из контекстного менеджера, проверю дважды. - person Giannis; 11.02.2017
comment
менеджер контекста обрабатывает его initd.org/psycopg/docs/usage.html# с оператором - person Giannis; 11.02.2017
comment
Извините... Я даже сам проверил эту страницу. Слишком быстро читает видимо. - person hoyland; 11.02.2017
comment
Странно то, что идентификатор увеличивается, поэтому в базе данных что-то происходит. - person Giannis; 11.02.2017
comment
Я обновил описание на более понятный пример. - person Giannis; 12.02.2017
comment
@Giannis Последовательность всегда будет увеличиваться независимо от успеха транзакции. - person Clodoaldo Neto; 12.02.2017