【问题标题】:Why does DBIx::Class::Schema::Loader change my table name from plural to singular?为什么 DBIx::Class::Schema::Loader 将我的表名从复数更改为单数?
【发布时间】:2017-08-01 01:54:18
【问题描述】:

我正在使用DBIx::Class::Schema::Loader 来创建这样的架构:

#!/usr/bin/perl

use strict;
use warnings;

use DBIx::Class::Schema::Loader qw/make_schema_at/;

make_schema_at(
    "Mydb::Schema",
    {debug => 0, dump_directory => "../db/",
    generate_pod => 0,},
    ["dbi:mysql:mydb:localhost:3306", 'mydb', 'password'],
);

我在MySQL中的表名是people,但是当我运行这段代码时,生成的类被命名为Mydb::Schema::Result::Person

$ cat Mydb/Schema/Result/Person.pm 
use utf8;
package Mydb::Schema::Result::Person;

# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THE FIRST PART OF THIS FILE

use strict;
use warnings;

use base 'DBIx::Class::Core';
__PACKAGE__->table("people");
__PACKAGE__->add_columns(
  "pplid",
  {
    data_type => "smallint",
    extra => { unsigned => 1 },
    is_auto_increment => 1,
    is_nullable => 0,
  },
...
...

为什么“人”被转换为“人”?

【问题讨论】:

  • 这是您或其他人编写的脚本。它不是 DBIx::Class 的一部分。您可能在那里定义了该映射。
  • @simbabque 脚本所做的就是调用DBIx::Class::Schema::Loader::make_schema_at。 DBIx::Class 正在这样做,它不是 OP 创建的一些映射。
  • @ThisSuitIsBlackNot 当我写该评论时,代码还没有出现在问题中。我知道复数,但我希望它可以用于不能有单数的单词。
  • 值得澄清的是,DBIC 没有更改表的名称。 DBIC 没有对您的数据库做任何事情。 DBIC 正在创建一个基于复数表名的结果集类。

标签: mysql perl dbix-class


【解决方案1】:

默认情况下,DBIx::Class::Schema::Loader 将 Result 类的名称单数化。有一个人的数据库表是有意义的,但有一个对象代表一个叫做“人”的人就没有意义了。

如果你真的想要,你可以通过在make_schema_at 中设置naming 选项来改变它:

make_schema_at(
    "Mydb::Schema",
    {
        debug          => 0,
        dump_directory => "../db/",
        generate_pod   => 0,
        naming         => { monikers => 'preserve' }
    },
    ["dbi:mysql:mydb:localhost:3306", 'mydb', 'password'],
);

但我建议坚持使用默认值。

【讨论】:

  • 谢谢。彻底解决了问题。只有一个问题:我希望它不会对我项目中的其他 DBIx 代码造成任何麻烦?
  • 我想补充的另一条评论是:当它像这样更改名称时,它会在程序员的头脑中保持直截了当的问题。它也不会更改 .pm 文件内容中的表名,所以我只是使用了上面的选项,让它看起来“正常”
  • 人与人之间的关系很奇怪,特别是如果英语不是你的第一语言,但总的来说它确实有意义。想想BooksBook,这很合理。
  • @rajeev 请记住,生成的类的对象代表数据库表中的单行,而不是整个表。当您从人员列表中获取结果时,单个结果将是一个人,而不是一个人。 ORM 的全部意义在于抽象出数据库,所以无论如何你都不应该考虑表名。
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多