2013-09-01 4 views
1

У меня есть БД MySQL с несколькими таблицами и представлениями по этим таблицам. Вид ограничивает то, что можно увидеть в данных одного клиента (create view ... where customer_id = X). Приложение Catalyst будет разговаривать с этими видами, а не с фактическими таблицами. Единственная разница между столбцами представления и базовыми таблицами заключается в том, что в представлении отсутствует столбец customer_id (то есть в приложении, похоже, что текущий клиент является единственным в системе).Загрузчик схемы DBIC: как пропустить столбцы

Проблема заключается в том, что я не могу использовать 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 

Как я могу иметь загрузчик пропустить некоторые столбцы при загрузке время?

ответ

1

Я не уверен, как вы можете заставить загрузчик пропускать столбцы во время загрузки, но вы можете удалить их после загрузки. Например, вы можете добавить что-то вроде этого к любому классу, который нуждается в колонке удалено:

__PACKAGE__->remove_column('customer_id'); 
+0

Спасибо, Я уже найдено обходное решение ... –

0

я не уверен, если есть возможность для этого в DBIC :: Schema :: Loader, Документы покажут вы. Если вы не просто сгенерируете схему, а затем удалите определение столбца.

Но, кроме того, вам, похоже, не хватает основной функции DBIC: Цепочка ResultSet. Если вы используете, например, Catalyst у вас будет действие, которое будет фильтровать ваш ResultSet в кошельке на основе идентификатора клиента, и все связанные с ним под-действия будут видеть только разрешенные строки.

+0

Да, я знаю об этом, но я хотел разделить клиентов на уровне БД (а позже, возможно, на основе имен БД). –

0

Я закончил тем, что просто оставил столбец для того, что он есть, поэтому он отображается в коде приложения. Представления и триггеры DB гарантируют, что приложение может только вставить и выбрать текущий идентификатор клиента. Единственный трюк, который я использовал, заключался в использовании 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}'