2

本番環境を模倣したテスト環境として sqlite3 データベースを作成しようとしています。プロダクションのセットアップ方法により、テーブルは複数のスキーマにあります。

DBIx::Class でクラスをセットアップし$schema->storage->dbh_do、データベースをスキーマにアタッチするために使用し$schema-deploy()、データベースを作成するために使用しました。

ただし、2 番目のテーブルに外部キーを作成すると、次のエラーが発生します。

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
4

1 に答える 1

2

簡単な答えは、外部キー定義でテーブル名を使用する場合、データベース名を指定することはできない(そして指定する必要がない)ということです。sqliteのドキュメントはそれをそのように示しています。

このリンクは、「createtabledb.table」の部分でデータベース名を新しいテーブル名と一緒に使用する方法を示しています。

http://www.sqlite.org/lang_createtable.html

このリンクは、外部キー定義でデータベース名を使用できない方法を示しています。

http://www.sqlite.org/syntaxdiagrams.html#foreign-key-clause

于 2011-07-15T08:33:45.173 に答える