【问题标题】:DBIx::Class::Schema::Loader: make_schema_at doesn't find any relationshipDBIx::Class::Schema::Loader: make_schema_at 没有找到任何关系
【发布时间】: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" ])'

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

【问题讨论】:

    标签: database perl orm relational-database dbix-class


    【解决方案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 关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多