Perl 如何在附加的sqlite数据库中创建外键?

Perl 如何在附加的sqlite数据库中创建外键?,perl,sqlite,dbix-class,Perl,Sqlite,Dbix Class,我试图创建一个sqlite3数据库作为模拟生产环境的测试环境。由于产品的设置方式,表处于多个模式中 我已经在DBIx::Class中设置了这些类,使用$schema->storage->dbh_do将数据库与模式连接起来,并使用$schema-deploy()创建数据库 但是,在第二个表上创建外键时,我会遇到以下错误: DBIx::Class::Schema::deploy(): DBIx::Class::Schema::deploy(): DBI Exception: DBD::SQLite:

我试图创建一个sqlite3数据库作为模拟生产环境的测试环境。由于产品的设置方式,表处于多个模式中

我已经在DBIx::Class中设置了这些类,使用
$schema->storage->dbh_do
将数据库与模式连接起来,并使用
$schema-deploy()
创建数据库

但是,在第二个表上创建外键时,我会遇到以下错误:

DBIx::Class::Schema::deploy(): DBIx::Class::Schema::deploy(): DBI Exception: DBD::SQLite::db do failed: near ".": syntax error 
除去DBIx::Class最简单的复制测试如下

sqlite3 initial.db
SQLite version 3.6.23
Enter ".help" for instructions
Enter SQL statements terminated with a ";"   
sqlite> attach database 'other.db' as 'other';
sqlite> create table other.a( col1_a, col2_a);
sqlite> create table other.b( col1_b, col2_b, foreign key(col1_b) references other.a(col1_a));
Error: near ".": syntax error
sqlite> create table other.b( col1_b, col2_b, foreign key(col1_b) references a(col1_a));
sqlite> 
从外键子句中删除架构将成功创建表

如何使用DBIx::Class在外部模式中创建表

编辑:代码的完整示例

package MyApp::Schema;
use base qw/DBIx::Class::Schema/;
__PACKAGE__->load_namespaces();
1;


package MyApp::Schema::Result::A;
use base qw/DBIx::Class::Core/;
__PACKAGE__->table('other_db.A');
__PACKAGE__->add_columns(qw/ a1 a2 /);
__PACKAGE__->set_primary_key('a1');
__PACKAGE__->has_many(bs => 'MyApp::Schema::Result::B', 'b1');
1;

package MyApp::Schema::Result::B;
use base qw/DBIx::Class::Core/;
__PACKAGE__->table('other_db.B');
__PACKAGE__->add_columns(qw/ b1 b2 /);
__PACKAGE__->set_primary_key('b1');
__PACKAGE__->belongs_to(a => 'MyApp::Schema::Result::A', 'b1');
1;
主脚本:

use MyApp::Schema;

my $schema = MyApp::Schema->connect('dbi:SQLite:dbname=test.db','','',{});

my $res = $schema->storage->dbh_do(
    sub {
        my ($storage, $dbh) = @_;
        $dbh->do("attach database 'other.db' as other_db");
    }
);

$schema->deploy();
给出的错误是:

DBIx::Class::Schema::deploy(): DBIx::Class::Schema::deploy(): DBI Exception: DBD::SQLite::db do failed: near ".": syntax error [for Statement "CREATE TABLE other_db.B (
  b1  NOT NULL,
  b2  NOT NULL,
  PRIMARY KEY (b1),
  FOREIGN KEY(b1) REFERENCES other_db.A(a1)
)"] at dbi.pl line 17
 (running "CREATE TABLE other_db.B (
  b1  NOT NULL,
  b2  NOT NULL,
  PRIMARY KEY (b1),
  FOREIGN KEY(b1) REFERENCES other_db.A(a1)
)") at dbi.pl line 17

简单的回答是,在外键定义中使用表名时,不能(也不需要)指定数据库名。sqlite文档表明了这一点

此链接显示如何将数据库名称与“创建表db.table”部分中的新表名称一起使用:

然而,此链接显示了如何在外键定义中不使用数据库名称:


所以您更喜欢使用“其他”。在中,为了使代码更干净/更简单?我真的没有偏好。我的首选是DBIx::Class::Schema::deploy()生成一个create table语句,该语句将在SQLite上运行。在我看来,您的问题在于perl,而不是SQLite的语法。但是,如果附加的数据库与主数据库具有相同的表名,该怎么办?如何指定解决这种歧义的外键关系?