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 文档,这是因为:

此外,InnoDB 不识别或支持“内联 REFERENCES 规范”(如 SQL 标准中所定义),其中引用被定义为列规范的一部分。InnoDB 仅在指定为单独的 FOREIGN KEY 规范的一部分时才接受 REFERENCES 子句。

如果REFERENCES从列定义中删除 并添加FOREIGN KEY (recipe_id) REFERENCES recipe(id)到表定义中,FK 将实际在 MySQL 中创建,DBICSL 将创建belongs_to关系 from IngredienttoRecipehas_many关系 from Recipeto Ingredient

于 2012-05-31T23:38:42.250 回答