Почему нельзя вставить данные в таблицу отзывов? - PullRequest
0 голосов
/ 20 апреля 2020

В сообщении об ошибке упоминается, что нарушение ограничений внешнего ключа.

МОЯ ОШИБКА: sqlalchemy.ex c .IntegrityError: (psycopg2.errors.ForeignKeyViolation) вставка или обновление в таблице "reviews" нарушает внешний ключ ограничение "reviews_book_id_fkey" ДЕТАЛИ: Ключ (book_id) = (770) отсутствует в таблице "обзоры".

МОЙ ЗАПРОС:

db.execute("INSERT INTO reviews (comment, score, user_id, book_id) VALUES (:comment, :score, :user_id, :book_id)", {"comment":comment, "score": score, "user_id": user.id, "book_id": book_id})
    db.commit()

МОИ ТАБЛИЦЫ:

REVIEWS TABLE

BOOKS TABLE

enter image description here

ОБНОВЛЕНИЕ: Книги в таблица «книги» существует!

В случае, если проблема может быть в процессе заполнения, вот фрагмент кода о том, как я заполнил таблицу «книги»:

f = open("books.csv") 
reader = csv.reader(f) 
for isbn, title, author, year in reader: 
   if year != 'year': 
      db.execute("INSERT INTO books (isbn, title, author, year) VALUES (:isbn, :title, :author, :year)", {"isbn": isbn, "title": title, "author": author, "year": year}) 
db.commit()

ОБНОВЛЕНИЕ № 2: вот снимок моей таблицы «книги» и идентификатор виден:

database selection books table

1 Ответ

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

Я наконец-то провел исследование и решил его! оказалось, что я использовал postgreSQL, а я новичок ie, поэтому я посмотрел на синтаксис postgreSQL и решил отказаться от своей таблицы обзора и создать ее заново. Этот первый фрагмент кода показывает, как я СОЗДАЛ свою старую таблицу (ту, которая не работала)

CREATE TABLE reviews(
 id SERIAL PRIMARY KEY,
 score INTEGER NOT NUL,
 comment VARCHAR NOT NULL,
 user_id INTEGER REFERENCES users, #HERE WAS THE MISTAKE 
 book_id INTEGER REFERENCES books) #AND HERE AGAIN THE MISTAKE

Итак, как вы можете видеть, я забыл добавить столбец id в таблицы:

CREATE TABLE reviews(
 id SERIAL PRIMARY KEY,
 score INTEGER NOT NUL,
 comment VARCHAR NOT NULL,
 user_id INTEGER REFERENCES users(id),  # AND HERE I FIXED IT
 nook_id INTEGER REFERENCES books(id))  # AND HERE TOO

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

...