Posgres в python (psycopg2) оператор INSERT INTO зависает / зависает без вставки или сбоя - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь вставить данные в мою таблицу persons. Я пробовал как с помощью курсора в python cursor.execute(sql), так и путем подключения к базе данных с помощью терминала и вставки туда. Тем не менее, программа просто останавливается в точке выполнения. Я совершаю в конце . Таблица пуста и выглядит следующим образом:

CREATE TABLE Persons(
  AKey INT PRIMARY KEY, -- Person ID primary key
  Name VARCHAR(128) UNIQUE NOT NULL, -- Person name
  Website VARCHAR(256), -- URL for persons website
  IKey INT REFERENCES Institutions -- Institution affiliation 
);

И пример вставки выглядит так:

INSERT INTO persons (Akey, Name, Website, IKey) VALUES(1, 'John Smith', 'www.foo.bar', 1);

Вставка не выполнена и не выдает ошибку. Терминал или python просто останавливается на операторе вставки, очевидно, ничего не делая. Вставка в другие таблицы работает без проблем.

РЕДАКТИРОВАТЬ: я должен отметить, что я единственный, кто выполняет транзакции в этой базе данных, которая содержит только пустые таблицы.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Похоже, вы заблокированы на замок. См. Контроль блокировки . В каком-то другом сеансе произошло нечто, конфликтующее с вашим, например, вставка человека с таким же ключом или именем, как вы пытаетесь вставить, или удаление строки из учреждений, на которые вы пытаетесь сослаться, и этот сеанс не зафиксирован. Теперь ваша сессия ждет, чтобы увидеть, фиксирует ли этот другой или откат.

0 голосов
/ 12 апреля 2020

Я думаю, вы забыли зафиксировать свой запрос.

Полный пример выглядит следующим образом:

import contextlib

import psycopg2

db_config = dict(database="...", user="...", password="...")

with contextlib.closing(psycopg2.connect(**db_config)) as connection:
    try:
        with contextlib.closing(connection.cursor()) as cursor:
            sql = "INSERT INTO persons (Akey, Name, Website, IKey) VALUES(1, 'John Smith', 'www.foo.bar', 1);"
            cursor.execute(sql)
        connection.commit()
    except:
        connection.rollback()
        raise

...