У меня есть существующая база данных MySQL, которую я пытаюсь перенести на PostgreSQL, выполнив следующие действия. База данных довольно проста — у нее есть несколько внешних ключей и других ограничений, но нет триггеров, процедур и т. д.
- Используйте
DBIx::Class::Schema::Loader
для создания набораResult
классов из существующей базы данных MySQL. - Используйте классы
Result
для создания набора операторовCREATE TABLE
для PostgreSQL. - Запустите операторы
CREATE TABLE
, используяpsql
, чтобы настроить таблицы (я еще не дошел до импорта данных).
Сценарий, который я использую, выглядит следующим образом (с удаленными учетными данными и именем БД):
#!/usr/bin/perl
use Modern::Perl;
use DBIx::Class::Schema::Loader qw/ make_schema_at /;
my $dsn = 'dbi:mysql:dbname=database';
my $user = '';
my $pass = '';
make_schema_at(
'MyDB::Schema',
{ debug => 1, dump_directory => './lib' },
[ $dsn, $user, $pass
],
);
my $schema = MyDB::Schema->connect($dsn, $user, $pass);
$schema->create_ddl_dir(['PostgreSQL'], '0.1', './', undef, { add_drop_table => 0 });
Сценарий выполняется успешно, и классы Result
, и файл .sql
(содержащий все операторы CREATE TABLE
) выглядят так, как я и ожидал.
Однако в некоторых таблицах есть столбец slug
, который помечен как UNIQUE
в исходной схеме MySQL и приводит к следующим строкам как часть оператора CREATE TABLE
:
"slug" character varying(50) NOT NULL,
CONSTRAINT "slug" UNIQUE ("slug")
Когда я пытаюсь импортировать данные (используя psql < tables.sql
), я получаю следующую ошибку в каждой таблице с уникальным столбцом slug
после первого:
NOTICE: CREATE TABLE / UNIQUE will create implicit index "slug" for table "mytable"
ERROR: relation "slug" already exists
Насколько я понимаю, имена индексов должны быть уникальными в данной базе данных. У меня нет этой проблемы с MySQL, так как я просто объявляю slug VARCHAR(50) NOT NULL UNIQUE
без указания имени индекса.
Есть ли способ заставить DBIx::Class
(или SQL::Translator
, который использует функция create_ddl_dir
) генерировать уникальное имя индекса в выходных данных? Мне все равно, как называются индексы, хотя что-то, основанное на имени таблицы, было бы разумно. Я просмотрел документацию, но не вижу никаких параметров, позволяющих это сделать.
Я мог бы просто отредактировать каждое ограничение вручную, прежде чем импортировать файл .sql
, но там более 250 таблиц и множество коллизий, к тому же мне приходилось бы делать это каждый раз, когда я настраивал процесс миграции и заново создавал классы и SQL.
SQL::Translator
в своей схеме MySQL напрямую, минуяDBIx::Class::Schema::Loader
? - person nwellnhof   schedule 17.04.2013UNIQUE
в определении столбца. - person nwellnhof   schedule 25.04.2013