Я обертываю схему базы данных, используя схему DBIc, чтобы помочь с модульным тестированием кода.
На основе исходной базы данных я использовал dbidump
, чтобы сгенерировать схему из базы данных:
dbicdump -o dump_directory=./lib -o components='["InflateColumn::DateTime"]' -o debug=1 Test::Schema 'dbi:mysql:dbname=mcdowall_test' 'test'
Есть 2 таблицы InnoDB table_a
и table_b
.Проблема заключается в том, что table_a
имеет ограничение внешнего ключа для таблицы table_b
:
CREATE TABLE `table_b` (
`table_b_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`source_id` INT UNSIGNED NULL,
PRIMARY KEY (`table_b_id`),
KEY (`source_id`))
ENGINE = InnoDB;
CREATE TABLE `table_a` (
`table_a_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`source_id` INT UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`table_a_id`),
KEY (`table_a_id`),
CONSTRAINT `fk_ab`
FOREIGN KEY (`source_id`)
REFERENCES `table_b` (`source_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Это означает, что при использовании deploy()
для установки схемы во время тестирования таблицы устанавливаются в алфавитном порядке:
use Test::Schema
my $schema = Test::Schema->connect($dsn, $user, $pass, \%opts);
$schema->deploy();
Это вызывает следующую ошибку SQL, поскольку table_b
не существует, когда создается table_a
:
ERROR 1215 (HY000): Cannot add foreign key constraint
Есть ли способ получить функцию deploy()
либо предварительно проверить зависимости внешнего ключа, либо указать конкретные таблицы, которые нужно вставить сначала?
В идеале сначала нужно установить table_b
, а затем table_a
.