我有一個現有的MySQL數據庫,我嘗試使用以下步驟遷移到PostgreSQL。該數據庫是相當簡單 - 它有幾個外鍵和其他方面的限制,但沒有觸發器,過程等使用DBIx :: Class和PostgreSQL重複索引名稱
- 使用
DBIx::Class::Schema::Loader
從現有的MySQL數據庫生成一組Result
類。 - 使用
Result
類來產生一組CREATE TABLE
報表PostgreSQL的。 - 運行使用
psql
來設置表(我還沒有得到儘可能數據匯入功能)的CREATE TABLE
語句。
我使用的腳本如下(有憑據和數據庫名稱中刪除):
#!/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
列其標記爲在原有的MySQL架構UNIQUE
,並導致以下行作爲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。
您是否嘗試過在你的MySQL架構運行'SQL :: Translator'的情況下直接通過'DBIx去::類: :架構:: Loader'? – nwellnhof
同樣的問題 - 它輸出的SQL會導致重複的索引名稱。 – pwaring
看來你在MySQL模式中創建了命名的唯一約束。它應該通過在列定義中簡單使用'UNIQUE'來使用未命名的約束。 – nwellnhof