1

DBIx::Class の使い方を学ぶために小さなプロジェクトに取り組んでおり、データベースからスキーマ コードを取得するために DBIx::Class::Schema::Loader を使用しようとしています。make_schema_at ツールはスキーマを作成しますが、クラス間の関係は挿入しません。私が進めている方法があります: テーブルの作成:

CREATE TABLE recipe (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    name varchar(255) NOT NULL,
    description TEXT NOT NULL
)
ENGINE InnoDB, CHARACTER SET utf8;

CREATE TABLE ingredient(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    recipe_id INT NOT NULL REFERENCES recipe(id),
    name TEXT NOT NULL,
    quantity INT NOT NULL
)
ENGINE InnoDB, CHARACTER SET utf8;

その後:

perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at("Recipes::Schema", { debug => 1 }, [ "dbi:mysql:dbname=recipes","user", "pass" ])'

私が間違っていることは何ですか?前もって感謝します。

4

1 に答える 1

2

DBICSL が関係をダンプしない最も一般的な理由は、実際には関係がないことです。データベースにいる場合SHOW CREATE TABLE ingredient、実際には外部キーが存在しないことがわかります。MySQL CREATE TABLE docsによると、これは次の理由によるものです。

さらに、InnoDB は、参照がカラム仕様の一部として定義されている「インライン REFERENCES 仕様」(SQL 標準で定義されている) を認識またはサポートしません。InnoDB は、個別の FOREIGN KEY 仕様の一部として指定されている場合にのみ REFERENCES 句を受け入れます。

REFERENCES列定義からを削除FOREIGN KEY (recipe_id) REFERENCES recipe(id)してテーブル定義に追加すると、実際には MySQL で FK が作成され、DBICSL はから への関係belongs_toと からIngredientへの関係を作成します。Recipehas_manyRecipeIngredient

于 2012-05-31T23:38:42.250 に答える