gpt4 book ai didi

perl - 在这种简单的情况下,我应该如何设置 DBIx::Class 结果类?

转载 作者:行者123 更新时间:2023-12-04 12:14:55 27 4
gpt4 key购买 nike

假设我有一个由三个表组成的以下简化示例数据库:

CREATE TABLE people (
person_id INTEGER PRIMARY KEY,
person_name VARCHAR(100)
);

CREATE TABLE events (
event_id INTEGER PRIMARY KEY,
event_name VARCHAR(100),
event_creator INTEGER
CONSTRAINT fk_event_creator REFERENCES people(person_id)
);

CREATE TABLE event_attendees (
event_id INTEGER NOT NULL
CONSTRAINT fk_event_attendee_event
REFERENCES events(event_id),
person_id INTEGER NOT NULL
CONSTRAINT fk_event_attendee_person
REFERENCES people(person_id),
role CHAR(1), -- O: organizer, P: performer, S: speaker, G: guest
CONSTRAINT pk_event_attendees PRIMARY KEY (event_id, person_id)
);

给定一个 event_id ,我可能想查询所有组织者的姓名,给定 person_id我可能想查找此人是该事件的客人或创建者的所有事件的名称,等等。

我知道如何使用简单的 SQL 来完成所有这些工作。你能告诉我我需要设置哪些结果类以及在使用 DBIx::Class 时需要指定哪些类型的关系吗? ?

最佳答案

您是否熟悉 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'T EDIT ABOVE此行”行),您可以决定数据库中的模式是您的主要来源,并保存 Schema::Loader 脚本以再次运行以在数据库更改时自动重新生成类。

更新

使用 DBIx::Class::Schema::Loader v0.05002 无法正确处理上述模式的部分内容,因为 Sinan 设法找到了一个错误!如果“引用”部分和列名不在同一行,则外键约束未正确解析。

该错误已在 DBICSL git 中修复,但由于该修复程序尚未发布,因此关系应如下所示(我省略了列定义以节省空间;它们应该与加载程序当前生成它们的一样)。

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" },
{}
);

事件.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"
);

人.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"
);

关于perl - 在这种简单的情况下,我应该如何设置 DBIx::Class 结果类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2290964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com