У меня есть база данных 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