1

複数のテーブルとそれらのテーブルのビューを持つ MySQL DB があります。ビューは、表示できる内容を 1 人の顧客のデータに限定します ( create view ... where customer_id = X)。Catalyst アプリは、実際のテーブルではなく、これらのビューと通信します。ビューの列と基礎となるテーブルの列の唯一の違いは、ビューに列がないことcustomer_idです (つまり、アプリケーションからは、現在の顧客がシステム内の唯一の顧客のように見えます)。

問題は、DBIC Schema Loader を使用してビューからスキーマをロードできないことです。ビューにはすべての関係とキーがないためです。ベース テーブルからスキーマをロードし、それをビューで使用する必要があります。customer_id問題は、その列を取り除くことができないことです。アプリケーションが対話するビューには存在しないため、それを取り除く必要があります。

filter_generated_code生成されたコードから不要なビットを削除するオプションを使用することになりましたが、生成中に次のエラーが発生します。

DBIx::Class::Schema::Loader::make_schema_at(): No such column customer_id
at /opt/merp/perl/lib/perl5/Catalyst/Helper/Model/DBIC/Schema.pm line 635

ロード時にローダーが特定の列をスキップするようにするにはどうすればよいですか?

4

3 に答える 3

0

私はそれが何であるかのために列を残すだけになったので、アプリケーションコードに表示されます。DB ビューとトリガーにより、アプリケーションは現在設定されている顧客 ID のみを挿入および選択できるようになります。私が採用した唯一のトリックはfilter_generated_code、基になるテーブル名をビュー名に置き換えることでした (先頭のアンダースコアを削除するだけです)。このようにshow tablesして、ビューをフィルター処理し、構造をDBICクラスにダンプし、テーブル名をビュー名に置き換えるスクリプトができました。次のようになります。

exclude=`mysql -u user -ppassword -D db --execute='show tables' \
--silent --skip-column-names | egrep "^_" | sed "s/^_//g" | \
sed ':a;N;$!ba;s/\n/|/g'`

perl script/proj_create.pl model DB DBIC::Schema Proj::Schema \
create=static components=TimeStamp filter_generated_code=\
'sub { my ($type,$class,$text) = @_; $text =~ s/([<"])_/$1/g; return $text; } ' \
exclude="^($exclude)$" dbi:mysql:db 'user' 'password' quote_names=1 '{AutoCommit => 1}'
于 2013-09-09T18:50:35.017 に答える