编辑:在这一点上,我找到了错误的拼写错误,我的问题变成了“我所犯的拼写错误是如何导致我收到的错误的”和“我将来如何才能更好地调试这个错误?”
我已经为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
我猜这跟“main”有关一部分,但我不确定是什么。
编辑:好的,PRAGMA foreign_keys=ON肯定也参与其中了。当我创建连接时,我打开了foreign_keys。如果我不打开它,我似乎不会得到这个错误。
我应该提到脚本中还有更多内容,但我假设错误发生在前两个语句中。脚本的其余部分只是执行相同的操作,drop table,define表。其中一些表具有对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“是从哪里来的,不知何故,有几个字符被剪掉了。我猜解决这个问题也许能解决我的问题。
但我真的很困惑这个表中的一条折线是如何导致脚本第一次正确运行的,然后在我第二次运行它时又给了我一个与另一个表相关的错误,以及外键是如何在其中发挥作用的。
我想,从上面重申一下,有没有更好的方法来调试这类东西?
发布于 2015-07-21 20:55:17
错误的来源是您的打字错误
REFERENCES LandTerrito在你的脚本的第8行。这会导致CREATE TABLE LandAdjacent语句中的表LandTerrito“缺失”。
如果你运行你的两个CREATE TABLE语句,Sqlite不会抱怨。但是,如果您使用PRAGMA foreign_keys=ON;并尝试在表LandAdjacent上运行INSERT或DELETE语句,则会得到错误no such table: main.LandTerrito。
但是,由于外键约束,LandTerritory上的DROP TABLE将导致表LandAdjacent上的DELETE,这将触发错误。
以下操作可避免出现错误
PRAGMA foreign_keys=ON;先添加虚拟表格LandTerrito (已测试)或LandAdjacent,然后<代码>D22(已测试)或<代码>H223ON DELETE CASCADE (未测试)发布于 2012-08-24 07:00:59
在drop table语句和create语句之间放置一个"GO“(或SQLlite中使用的任何等效语句)来终止批处理
https://stackoverflow.com/questions/12099802
复制相似问题