Вставить в таблицу только с одним последовательным столбцом фактически ничего не вставляет - PullRequest
0 голосов
/ 31 января 2019

У меня есть база данных postgres со следующей таблицей:

CREATE TABLE stocks 
    (
       id serial PRIMARY KEY
    );

и другой таблицей, которая выглядит следующим образом:

CREATE TABLE stock_attributes 
    (
       id serial PRIMARY KEY,
       market_id TEXT,
       short_name TEXT,
       full_name TEXT,
       isin TEXT,
       stock_id serial REFERENCES stocks(id)
    );

Это моя попытка нормализации, так что извините, еслиЭто неправильно, но я пытаюсь вставить новую строку в таблицу stocks, а затем использовать идентификатор другой вставки во 2-ю таблицу:

INSERT INTO stocks DEFAULT VALUES RETURNING id;

Запрос выполняется и возвращает новыйid, но когда я запускаю второй запрос в таблицу stock_attributes, я получаю сообщение об ошибке, что id отношения не существует в таблице складов.

INSERT INTO stock_attributes AS a (market_id, short_name, full_name, isin, stock_id) VALUES (%s, %s, %s, %s, %s);

Этот сбой при

insert or update on table "stock_attributes" violates foreign key constraint "stock_attributes_stock_id_fkey"
DETAIL:  Key (stock_id)=(3) is not present in table "stocks".

Я использую psycopg2 с python.

Вот код, в значительной степени скопированный из руководств по postgres python:


def execute(sql,args):
    conn = None
    try:
        # read database configuration
        params = config()
        # connect to the PostgreSQL database
        conn = psycopg2.connect(**params)
        # create a new cursor
        cur = conn.cursor()
        cur.execute(sql, args)
        conn.commit()
        # close communication with the database
        cur.close()
        print("SQL executed")
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

def execute_and_return(sql, args):
    """ insert a new vendor into the vendors table """
    conn = None
    rows = None
    try:
        # read database configuration
        params = config()
        # connect to the PostgreSQL database
        conn = psycopg2.connect(**params)
        # create a new cursor
        cur = conn.cursor()
        cur.execute(sql, args)
        rows = cur.fetchall()
        # close communication with the database
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()
    return rows

1 Ответ

0 голосов
/ 08 августа 2019

Ваша ключевая ссылка на таблицы stocks неверна.У вас есть:

stock_id serial REFERENCES stocks(id)

, когда должно быть:

 stock_id integer REFERENCES stocks(id)

Последовательный создает последовательности типа integer и задает тип столбца integer со значением по умолчанию nextval("<generated sequence name>").Если вы измените тип с serial на integer для внешнего ключа, он должен работать.

...