编辑:此时,我发现了错误的错字,我的问题变成了“我犯的错字是如何导致我收到错误的”和“我以后如何更好地调试它?”
我已经为 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。如果我不打开它,我似乎不会收到此错误。
而且我应该提到脚本还有更多内容,但我假设错误发生在前 2 个语句中。脚本的其余部分只是做同样的事情,删除表,定义表。一些表具有对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”来自,不知何故有几个字符被切断了。我猜想解决这个问题可能会解决我的问题。
但是我真的很困惑这个表中的虚线如何导致脚本第一次正确运行,然后在我第二次运行时给我一个与不同表相关的错误,以及外键如何发挥作用。
我想,从上面重申,有没有更好的方法来调试这种事情?