【问题标题】:Issue with SQLite DROP TABLE statementSQLite DROP TABLE 语句的问题
【发布时间】:2012-08-23 20:52:00
【问题描述】:

编辑:此时,我发现了错误的错字,我的问题变成了“我犯的错字如何导致我收到的错误”和“我以后如何更好地调试这个?”

我已经为 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”的出处,不知怎么的,有几个字符被截断了。我猜想解决这个问题可能会解决我的问题。

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

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

【问题讨论】:

  • 我知道您已经明确说明了脚本的工作原理,但为了确定,您可以发布它,或者至少发布相关部分吗?

标签: python sql sqlite pysqlite


【解决方案1】:

错误的根源是你的错字

REFERENCES LandTerrito

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

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

由于LandTerritory 上的外键约束@​​987654330@ 但是会在表LandAdjacent 上产生DELETE,从而触发错误。

下面的事情可以避免错误

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2018-03-16
      相关资源
      最近更新 更多