如何使用pysqlite2在python中强制执行SQLite外键?

时间:2012-04-12 15:17:20

标签: python sqlite foreign-keys enforcement

我有一个SQLite数据库。根据{{​​3}},您需要版本3.6.19+,我有。我使用SQLite的3.7.10版本制作了它:

>>> from pysqlite2 import dbapi2 as sqlite
>>> print sqlite.sqlite_version
3.7.10

所以它应该支持外键。

我有以下sqlite数据库创建语句:

DROP TABLE IF EXISTS `msrun`;
-- -----------------------------------------------------
-- Table `msrun`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `msrun` (
  `msrun_name` VARCHAR(40) PRIMARY KEY NOT NULL ,
  `description` VARCHAR(500) NOT NULL );

DROP TABLE IF EXISTS `feature`;
-- -----------------------------------------------------
-- Table `feature`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `feature` (
  `feature_id` VARCHAR(40) PRIMARY KEY NOT NULL ,
  `intensity` DOUBLE NOT NULL ,
  `overallquality` DOUBLE NOT NULL ,
  `charge` INT NOT NULL ,
  `content` VARCHAR(45) NOT NULL ,
  `msrun_msrun_name` VARCHAR(40) NOT NULL ,
  CONSTRAINT `fk_feature_msrun1`
    FOREIGN KEY (`msrun_msrun_name` )
    REFERENCES `msrun` (`msrun_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

  CREATE UNIQUE INDEX `id_UNIQUE` ON `feature` (`feature_id` ASC);
  CREATE INDEX `fk_feature_msrun1` ON `feature` (`msrun_msrun_name` ASC); 

因此,功能表中的msrun_msrun_name是msrun表中msrun_name的外键。但是,当我填写功能表时,我可以填写msrun_msrun_name所需的任何内容。外键未被强制执行。

根据this answer,需要启用强制执行,并且它给出了如何使用SQLAlchemy的答案,但我没有使用SQLAlchemy。

如何使用pysqlite2强制执行外键?

2 个答案:

答案 0 :(得分:0)

尝试使用SQLite的PRAGMA foreign_keys=ON;命令,默认情况下禁用它。

答案 1 :(得分:0)

尝试使用PRAGMA foreign_keys命令。例如:

sqlite> PRAGMA foreign_keys = ON;

然后查看当前是否启用了外键:

sqlite> PRAGMA foreign_keys;
0
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
1
sqlite> PRAGMA foreign_keys = OFF;
sqlite> PRAGMA foreign_keys;
0