我将 DBIx::Class
模块用于我拥有的应用程序的 ORM 方法。
我的人际关系有些问题。
我有以下内容
package MySchema::Result::ClusterIP;
use strict;
use warnings;
use base qw/DBIx::Class::Core/;
our $VERSION = '1.0';
__PACKAGE__->load_components(qw/InflateColumn::Object::Enum Core/);
__PACKAGE__->table('cluster_ip');
__PACKAGE__->add_columns( # Columns here );
__PACKAGE__->set_primary_key('objkey');
__PACKAGE__->belongs_to( 'configuration' => 'MySchema::Result::Configuration', 'config_key');
__PACKAGE__->belongs_to( 'cluster' => 'MySchema::Result::Cluster',
{ 'foreign.config_key' => 'self.config_key',
'foreign.id' => 'self.cluster_id'
}
);
还有
package MySchema::Result::Cluster;
use strict;
use warnings;
use base qw/DBIx::Class::Core/;
our $VERSION = '1.0';
__PACKAGE__->load_components(qw/InflateColumn::Object::Enum Core/);
__PACKAGE__->table('cluster');
__PACKAGE__->add_columns( # Columns here );
__PACKAGE__->set_primary_key('objkey');
__PACKAGE__->belongs_to( 'configuration' => 'MySchema::Result::Configuration', 'config_key');
__PACKAGE__->has_many('cluster_ip' => 'MySchema::Result::ClusterIP',
{ 'foreign.config_key' => 'self.config_key',
'foreign.cluster_id' => 'self.id'
});
还有几个其他模块,但我认为它们不相关。
当我尝试部署此模式时,出现以下错误:
DBIx::Class::Schema::deploy(): DBI Exception: DBD::mysql::db do failed: Can't create table 'test.cluster_ip' (errno: 150) [
for Statement "CREATE TABLE `cluster_ip` (
`objkey` smallint(5) unsigned NOT NULL auto_increment,
`config_key` smallint(5) unsigned NOT NULL,
`cluster_id` char(16) NOT NULL,
INDEX `cluster_ip_idx_config_key_cluster_id` (`config_key`, `cluster_id`),
INDEX `cluster_ip_idx_config_key` (`config_key`),
PRIMARY KEY (`objkey`),
CONSTRAINT `cluster_ip_fk_config_key_cluster_id` FOREIGN KEY (`config_key`, `cluster_id`) REFERENCES `cluster` (`config_key`, `id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `cluster_ip_fk_config_key` FOREIGN KEY (`config_key`) REFERENCES `configuration` (`config_key`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB"] at test_deploy.pl line 18
(running "CREATE TABLE `cluster_ip` (
`objkey` smallint(5) unsigned NOT NULL auto_increment,
`config_key` smallint(5) unsigned NOT NULL,
`cluster_id` char(16) NOT NULL,
INDEX `cluster_ip_idx_config_key_cluster_id` (`config_key`, `cluster_id`),
INDEX `cluster_ip_idx_config_key` (`config_key`),
PRIMARY KEY (`objkey`),
CONSTRAINT `cluster_ip_fk_config_key_cluster_id` FOREIGN KEY (`config_key`, `cluster_id`) REFERENC
ES `cluster` (`config_key`, `id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `cluster_ip_fk_config_key` FOREIGN KEY (`config_key`) REFERENCES `configuration` (`conf
ig_key`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB") at test_deploy.pl line 18
据我所知,MySQL 提示 FOREIGN KEY 约束,特别是 cluster< 中对 (
表。从我对 MySQL 文档的阅读来看,这似乎是一个合理的提示,尤其是关于 this doc page 的第三个要点。 .config_key
, id
) 的引用
这是我的问题。我是否在 DBIx::Class
模块中遗漏了什么?我意识到我可以明确地创建必要的索引来匹配这个外键约束,但这似乎是重复性的工作。我应该做些什么来使这种情况隐式发生吗?
最佳答案
不确定这里发生了什么 SQL::Translator::Producer::MySQL应该在部署的 DDL 的开头插入 SET foreign_key_checks=0
,这样就不会出现外键错误。我怀疑即使在部署了整个 DDL 之后还是有什么东西坏了。您可以通过连接到数据库并运行以下语句来找出外键错误的确切性质:
SHOW INNODB STATUS;
关于mysql - 我是否需要为 DBIx::Class belongs_to 关系手动创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5071848/