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将创建从Ingredient
到Recipe
的belongs_to
关系以及从Recipe
到Ingredient
的has_many
关系。
【讨论】:
以上是关于DBIx::Class::Schema::Loader: make_schema_at 没有找到任何关系的主要内容,如果未能解决你的问题,请参考以下文章