Почему я получаю несоответствие внешнего ключа при попытке объединить две таблицы с помощью внешних ключей?Python

Программы на Python
Ответить
Anonymous
 Почему я получаю несоответствие внешнего ключа при попытке объединить две таблицы с помощью внешних ключей?

Сообщение Anonymous »

Я читаю главу 16 «Базы данных SQLite для автоматизации скучных задач с помощью Python», автор Эл. Мы со Свейгартом столкнулись с проблемой в разделе «Объединение нескольких таблиц с помощью внешних ключей». Да будет вам известно, что я только начал разбираться в Python и впервые изучаю базы данных и SQLite.
У меня есть файл sweigartcats.db, содержащий таблицу «cats», вот ее столбцы:

Код: Выделить всё

>>> conn.execute('PRAGMA TABLE_INFO(cats)').fetchall()
[(0, 'name', 'TEXT', 1, None, 0), (1, 'birthdate', 'TEXT', 0, None, 0), (2, 'fur', 'TEXT', 0, None, 0), (3, 'weight_kg', 'REAL', 0, None, 0)]
В учебнике показано, как создать еще одну таблицу под названием «Прививки» (которая будет успешно создана) со следующей структурой:

Код: Выделить всё

>>> conn.execute('CREATE TABLE IF NOT EXISTS vaccinations (vaccine TEXT,
date_administered TEXT, administered_by TEXT, cat_id INTEGER,
FOREIGN KEY(cat_id) REFERENCES cats(rowid)) STRICT')
Значения, вставленные в таблицу прививок, используют идентификатор строки таблицы кошек для связи данных о вакцинации выбранной кошки, в этом случае кошка «Зофи» имеет идентификатор строки 1:

Код: Выделить всё

>>> conn.execute('INSERT INTO vaccinations VALUES ("rabies", "2023-06-06", "Dr. Echo", 1)')
Однако вместо возврата объекта Cursor он выдает ошибку:

Код: Выделить всё

sqlite3.OperationalError: foreign key mismatch - "vaccinations" referencing "cats"
Ранее сегодня по какой-то причине эта ошибка не произошла, когда я вставил значения (я не помню, чтобы делал что-то другое), и мне удалось использовать следующий код, чтобы вернуть кортеж, который объединил данные rowid cat и его вакцин:

Код: Выделить всё

>>> conn.execute('SELECT * FROM cats INNER JOIN vaccinations ON cats.rowid =
vaccinations.cat_id').fetchall()
Но это продолжалось недолго, поскольку рядом с ней возникла ошибка несоответствия внешнего ключа, когда я пытался использовать iterdumps() для копирования базы данных в файл .txt. Я много раз пытался переделать ее, используя исходный файл, но ошибка возникает всегда, и я больше не могу ничего вставить в таблицу прививок (даже если я копирую код прямо с веб-сайта, чтобы убедиться, что это не опечатка).
Я не уверен, что это необходимо, но вот запросы, использованные для создания исходного файла: https://pastebin.com/neG0q4Ai
Я проверил документацию sqlite3 и несколько вопросов здесь, и, по-видимому, может возникнуть проблема с использованием rowid в качестве внешнего ключа, но я не очень знаком с ним, поэтому не могу быть уверен, а также тот факт, что он находится в книге без каких-либо ошибок, и я не смог найти кого-либо еще с такой же ошибкой в этом конкретном уроке, что может означать Я что-то ошибаюсь.
Одна из практических программ в конце этой главы включает проверку прививок кошек, поэтому я смогу сделать это только в том случае, если сначала смогу выполнить эту работу.
Прошу прощения, если я забыл добавить важную информацию, и я добавлю ее, если необходимо.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... sing-forei
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»