Вы знакомы с DBIx :: Class :: Schema :: Loader ? Хотя он может использоваться в одноразовых сценариях для динамического создания схемы DBIC в памяти, он также имеет возможность работать в режиме «одного выстрела», где он записывает определения схемы на диск, чтобы вы могли редактировать и использовать их, и это способ более продвинутый, чем вы думаете.
Во-первых, вы хотите, чтобы схема фактически присутствовала в базе данных, чтобы загрузчик мог ее сканировать. Затем вы делаете что-то вроде:
perl -MDBIx::Class::Schema::Loader=make_schema_at \
-e 'make_schema_at("MyApp::Schema", {dump_directory=>"schema_out"},' \
-e '["dbi:DBType:connstring", "user", "pass"]);'
(где «MyApp :: Schema» - это имя пакета, к которому вы хотите предоставить сгенерированные классы схемы, а «schema_out» - каталог, в котором они должны быть сгенерированы).
После этого вы можете редактировать сгенерированные классы схемы или, если вы обнаружите, что загрузчик выполняет достаточно хорошую работу (или, по крайней мере, достаточно хорошую работу, вам не нужно редактировать что-либо выше «DON»). «РЕДАКТИРОВАТЬ ЭТУ ЛИНИЮ» (строка), вы можете решить, что схема в БД является вашим основным источником, и сохранить сценарий Schema :: Loader для повторного создания классов в случае изменения БД.
Обновление
Части вышеупомянутой схемы не обрабатываются правильно с DBIx :: Class :: Schema :: Loader v0.05002, потому что Синану удалось найти ошибку! Ограничения внешнего ключа не были проанализированы правильно, если часть «ссылки» и имя столбца не были в одной строке.
Ошибка исправлена в git DBICSL, но так как исправление еще не выпущено, вот как должны выглядеть отношения (я опускаю определения столбцов, чтобы сэкономить место; они должны быть такими же, как в настоящий момент генерирует загрузчик) их).
EventAttendee.pm
__PACKAGE__->set_primary_key(qw(event_id person_id));
__PACKAGE__->belongs_to(
"event" => "MyApp::Schema::Result::Event",
{ event_id => "event_id" },
{}
);
__PACKAGE__->belongs_to(
"person" => "MyApp::Schema::Result::Person",
{ person_id => "person_id" },
{}
);
Event.pm
__PACKAGE__->set_primary_key("event_id");
__PACKAGE__->belongs_to(
"event_creator" => "MyApp::Schema::Result::Person",
{ person_id => "event_creator" },
{ join_type => "LEFT" },
);
__PACKAGE__->has_many(
"event_attendees" => "MyApp::Schema::Result::EventAttendee",
{ "foreign.event_id" => "self.event_id" },
);
# Not auto-generated, but you probably want to add it :)
__PACKAGE__->many_to_many(
"people_attending" => "event_attendees" => "person"
);
People.pm
__PACKAGE__->has_many(
# It might be wise to change this to "events_created"
"events" => "MyApp::Schema::Result::Event",
{ "foreign.event_creator" => "self.person_id" },
);
__PACKAGE__->has_many(
"event_attendees" => "MyApp::Schema::Result::EventAttendee",
{ "foreign.person_id" => "self.person_id" },
);
# Not auto-generated, but you probably want to add it :)
__PACKAGE__->many_to_many(
"events_attending" => "event_attendees" => "event"
);