РЕДАКТИРОВАТЬ: На данный момент я обнаружил ошибочную опечатку, которая была ответственной, и мой вопрос стал «Как опечатка, которую я сделал, вызвала ошибку, которую я получил» и «Как я мог бы лучше отладить это в будущем?»
Я настроил скрипт базы данных для SQLite (через pysqlite) следующим образом:
DROP TABLE IF EXISTS LandTerritory;
CREATE TABLE LandTerritory (
name varchar(50) PRIMARY KEY NOT NULL UNIQUE,
hasSC boolean NOT NULL DEFAULT 0
);
Я ожидаю, что это всегда будет работать без ошибок. Однако, если я запускаю этот сценарий дважды (используя метод sqlite.Connection.executescript
), я получаю следующую ошибку:OperationalError:table LandTerritory already exists
Пытаясь отладить это самостоятельно, я запускаю DROP TABLE LandTerritory
самостоятельно и получаю: sqlite3.OperationalError: no such table: main.LandTerrito
Я предполагаю, что это как-то связано с "главным". часть, но я не уверен, что.
РЕДАКТИРОВАТЬ: Хорошо, PRAGMA foreign_keys=ON
определенно здесь тоже замешан. Когда я создаю свое соединение, я включил Foreign_keys. Если я не включу это, я, кажется, не получаю эту ошибку.
И я должен был упомянуть, что в сценарии есть еще что-то, но я предположил, что ошибка возникает в этих первых двух утверждениях. Остальная часть скрипта делает то же самое, удаляет таблицу, определяет таблицу. В некоторых таблицах есть внешние ссылки на LandTerritory
.
Есть ли способ получить что-то вроде информации о номере строки об ошибках sqlite? Это было бы очень полезно.
РЕДАКТИРОВАТЬ 2: Хорошо, вот еще одна таблица в сценарии, которая ссылается на первую.
DROP TABLE IF EXISTS LandAdjacent;
CREATE TABLE LandAdjacent (
tname1 varchar(50) NOT NULL,
tname2 varchar(50) NOT NULL,
PRIMARY KEY (tname1, tname2),
/* Foreign keys */
FOREIGN KEY (tname1)
REFERENCES LandTerrito
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (tname2)
REFERENCES LandTerritory(name)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Глядя на это, я обнаружил, что откуда взялось «LandTerrito», несколько символов каким-то образом были обрезаны. Я предполагаю, что исправление этого может решить мою проблему.
Но я действительно сбит с толку тем, как ломаная строка в этой таблице привела к тому, что скрипт работал правильно в первый раз, а затем выдал мне ошибку, связанную с другой таблицей, когда я запускаю ее во второй раз, и как внешние ключи сыграли в этом роль.
Я думаю, повторяю вышеизложенное, есть ли лучший способ отладки такого рода вещей?