index对DBIx :: Class不可见

时间:2017-08-21 22:31:06

标签: perl dbix-class

我有这个小的perl代码,它会在表中添加一条记录,但我很困惑为什么DBIC无法看到主键?

我无法在任何地方找到任何答案。首先,表和列的名称是camelCase,然后我将其更改为下划线,但它只是不会运行:(

$ ./test.pl
DBIx::Class::ResultSource::unique_constraint_columns(): Unknown unique constraint node_id on 'node' at ./test.pl line 80

代码:

sub addNode
{
    my $node = shift; my $lcNode = lc($node);
    my $id = $schema
        ->resultset('Node')
        ->find_or_create
        (
            { node_name => $lcNode },
            { key => 'node_id' }
        );
    return $id;
}

表格详情:

mysql> desc node;
+------------+-----------------------+------+-----+---------+----------------+
| Field      | Type                  | Null | Key | Default | Extra          |
+------------+-----------------------+------+-----+---------+----------------+
| node_id    | mediumint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| node_name  | varchar(50)           | NO   |     | NULL    |                |
| node_notes | varchar(1000)         | YES  |     | NULL    |                |
+------------+-----------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

DBIx ::类::结果集:

$ cat Node.pm
use utf8;
package Testdb::Schema::Result::Node;

# 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("node");
__PACKAGE__->add_columns(
  "node_id",
  {
    data_type => "mediumint",
    extra => { unsigned => 1 },
    is_auto_increment => 1,
    is_nullable => 0,
  },
  "node_name",
  { data_type => "varchar", is_nullable => 0, size => 50 },
  "node_notes",
  { data_type => "varchar", is_nullable => 1, size => 1000 },
);
__PACKAGE__->set_primary_key("node_id");


# Created by DBIx::Class::Schema::Loader v0.07045 @ 2017-08-21 22:14:58
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:bWXf98hpLJgNBU93aaRYkQ


# You can replace this text with custom code or comments, and it will be preserved on regeneration
1;

3 个答案:

答案 0 :(得分:2)

https://metacpan.org/pod/DBIx::Class::ResultSet#find

  

为了帮助您准备正确的存储查询,您可以提供key属性,该属性是unique constraint的名称(primary columns对应的唯一约束始终命名为primary )。

(强调我的。)

换句话说,要使用主键,您需要指定{ key => 'primary' }。查找任何其他key属性作为附加唯一约束的名称。

答案 1 :(得分:1)

您没有明确atom dir_of_interest 应该如何正常工作。但是,如果您想按addNode查找现有节点,则只需删除node_name属性:

key

但请阅读DBIC documentation中的警告:

  

如果没有找到这样的约束,my $id = $schema->resultset('Node')->find_or_create( { node_name => $lcNode } ); 目前默认为简单的find,可能会或可能不会达到预期效果。请注意,此后备行为可能会在其他版本中弃用。如果您需要使用任意条件进行搜索 - 请使用"搜索"。如果此回退产生的查询产生多行,则会发出效果警告,但只构造第一行并返回search->(\%column_values)

您应该考虑为$result_object添加唯一约束。

答案 2 :(得分:0)

来自Henry的DBIx列表中的真正的ans,无论你使用什么密钥,它对应的col都应该在查询中。以上所有都是模棱两可的,它们没有错,但它们并没有澄清确切的事实。