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

问题描述:

我有一个SQLite数据库。根据this answer您需要版本3.6.19+,我有。我使用SQLite版本3.7.10:如何在Python中使用pysqlite2强制执行SQLite外键?

>>> 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_name在msrun表的外键。但是,当我填写功能表时,我可以填写任何我想要的msrun_msrun_name。外键没有被执行。

根据this question强制执行需要打开,它给出了一个答案如何用SQLAlchemy做到这一点,但我没有使用SQLAlchemy。

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

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

+1

或蟒蛇cursor.execute( “PRAGMA foreign_keys = ON”) – 2012-04-12 16:17:29

尝试使用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