SQLite DROP TABLE语句的问题

时间:2012-08-23 20:52:00

标签: python sql sqlite pysqlite

编辑:此时,我发现了错误的拼写错误,我的问题变成了“我所做的拼写错误导致了我收到的错误”和“我将来如何更好地调试这个错误” ?“

我为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。如果我不打开它,我似乎没有得到这个错误。

我应该提到脚本还有更多内容,但我假设错误发生在前两个语句中。脚本的其余部分也是相同的,drop table,define table。一些表具有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”来自,不知何故,一些角色被切断了。我猜这可能会解决我的问题。

但我真的很困惑这个表中的一行是如何导致脚本第一次正确运行,然后在第二次运行它时给我一个与另一个表相关的错误,以及外键如何播放进入这个。

我想,从上面重申一下,有没有更好的方法来调试这种事情?

2 个答案:

答案 0 :(得分:1)

错误的来源是你的错字

REFERENCES LandTerrito

在你的脚本的第8行。这导致LandTerrito语句中的“缺失”表格CREATE TABLE LandAdjacent

如果你运行两个CREATE TABLE语句,Sqlite不会抱怨。但是,如果您PRAGMA foreign_keys=ON;并尝试在表INSERT上运行DELETELandAdjacent语句,则会收到错误no such table: main.LandTerrito

由于DROP TABLE上的外键约束LandTerritory会导致表DELETE上出现LandAdjacent,从而触发错误。

以下内容将避免错误

  1. 在删除表(已测试)或
  2. 之前设置PRAGMA foreign_keys=ON;
  3. 添加虚拟表LandTerrito(已测试)或
  4. 首先删除LandAdjacent,然后LandTerritory(已测试)或
  5. 不要使用ON DELETE CASCADE(未经测试)
  6. 当然要纠正原来的拼写错误。

答案 1 :(得分:-2)

放置一个“GO”(或SQLite中使用的任何等价物)来终止drop table语句和create语句之间的批处理