DBIx::Class::Schema::Loader: make_schema_at 没有找到任何关系

Posted

技术标签:

【中文标题】DBIx::Class::Schema::Loader: make_schema_at 没有找到任何关系【英文标题】:DBIx::Class::Schema::Loader: make_schema_at doesn't find any relationship 【发布时间】:2012-05-31 22:07:22 【问题描述】:

我正在做一个小项目,以便学习使用 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" ])'

我做错了什么? 提前致谢。

【问题讨论】:

【参考方案1】:

DBICSL 不转储您的关系的最常见原因是您实际上没有 关系。如果您在数据库中使用SHOW CREATE TABLE ingredient,您会看到实际上不存在外键。根据MySQL CREATE TABLE docs,这是因为:

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

如果从列定义中删除REFERENCES,并将FOREIGN KEY (recipe_id) REFERENCES recipe(id)添加到表定义中,FK实际上将在MySQL中创建,DBICSL将创建从IngredientRecipebelongs_to关系以及从RecipeIngredienthas_many 关系。

【讨论】:

以上是关于DBIx::Class::Schema::Loader: make_schema_at 没有找到任何关系的主要内容,如果未能解决你的问题,请参考以下文章