Как я могу применить внешние ключи SQLite в Python, используя pysqlite2?

У меня есть база данных SQLite. Согласно этому ответу вам нужна версия 3.6.19+, которая у меня есть. Я сделал это с помощью версии 3.7.10 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. Внешний ключ не применяется.

Согласно этому вопросу, принудительное включение должно быть включено, и оно дает ответ, как это сделать с помощью SQLAlchemy, но я не использую SQLAlchemy.

Как я могу применить внешние ключи с pysqlite2?

2 ответа

Решение

Попробуйте использовать SQLite PRAGMA foreign_keys=ON; команда отключена по умолчанию.

Попробуйте использовать команду 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
Другие вопросы по тегам