当使用在DBIx ::类ResultSource新()方法创建一个(可能是暂时的)变量,它似乎并没有填充在DBIC模式中指定的默认值的属性(这是我们创建从表中指定模式).
目前,我们正在为一个这样的类创建一个默认值(第一种情况,这是一个问题)
sub new {
my $class = shift;
my $self = $class->next::method(@_);
$self->queue('DEFAULT_QUEUE_VAL') unless $self->queue();
return $self;
}
Run Code Online (Sandbox Code Playgroud)
在该类中(即属性queue => DEFAULT_QUEUE_VAL).然而,长期来看,我们有不同的默认值几个DBIC类,我们想避免复制上述逻辑所有的各类案件.
有没有可用的CPAN模块/插件?我们没有看到任何我们(粗略地粗略地)搜索CPAN.
编辑:修复代码示例中的一些垃圾; 结果我从过时的代码中获取了cp'd.
我想像这样漂亮地打印DBIx :: Class :: ResultSet结果:
my $schema = MyDatabase::Main->connect('dbi:SQLite:db/example.db');
my $rs = $schema->resultset('Track')->all()
# then print $rs with all of those feilds
Run Code Online (Sandbox Code Playgroud)
我找到了DBIx :: SQLCrosstab :: Format类,但它似乎只适用于自己的查询.
我有以下代码:
package MyPackage::ResultSet::Case;
use base 'DBIx::Class::ResultSet';
sub cases_last_fourteen_days {
my ($self, $username) = @_;
return $self->search({
username => $username,
date => { '>=' => 'DATE_SUB(CURDATE(),INTERVAL 14 DAY)' },
});
};
Run Code Online (Sandbox Code Playgroud)
但是当我尝试以这种方式使用它时:
$schema->resultset('Case')->cases_last_fourteen_days($username)
Run Code Online (Sandbox Code Playgroud)
我总是得到零结果,谁能说出我做错了什么?
谢谢!
我想知道dbix中的多个唯一约束是否可能update_or_create
来自Cpan:
my $cd = $schema->resultset('CD')->update_or_create(
{
artist => 'Massive Attack',
title => 'Mezzanine',
year => 1998,
},
{ key => 'cd_artist_title' }
);
Run Code Online (Sandbox Code Playgroud)
我想做什么
my $cd = $schema->resultset('CD')->update_or_create(
{
artist => 'Massive Attack',
title => 'Mezzanine',
year => 1998,
},
{ key => {'cd_artist_title','year' }
);
Run Code Online (Sandbox Code Playgroud) 有没有人成功使用类似DBIx :: Class :: WebForm或CatalystX-CRUD的东西从数据库表自动构建自我验证的webform?
我正在想象一个模块,它读取数据库表模式,读取每列的约束,生成一些webform的抽象表示,带有错误消息的字段等.我正在使用Catalyst和Plack,它有一个很大的现有代码库.
我不想编写HTML webform,也不想编写任何验证逻辑.我的目标是以Ruby on Rails的风格编写尽可能少的代码.哪个Perl模块最适合这个?
更新:我已经用HTML :: FormFu解决了webform方面的问题,但它仍然很笨重地将表单输入映射到数据库,例如date_start和date_end都与'created'列相关,并且注释应该使用'LIKE%foo%匹配'等等'DBICFu'在哪里?
更新:这是一个Web应用程序,webform看起来不应该像数据库表.我不是在寻找数据库管理工具.
我正在开发一个将在运行时生成数据库表的应用程序.我正在使用Catalyst和DBIC,我需要在生成新表时生成新的ResultSet.这个新的ResultSet必须作为Catalyst模型添加,所以我可以,$c->model('DB::NewFoo')但我需要在运行时发生这种情况.
表生成和ResultSet生成不是问题,我需要的是在运行时将那些新生成的ResultSet添加到Model中,以便我可以在进一步的请求中调用它们.
到目前为止,我的想法是创建一个控制DBI::Class::Schema,提供访问器方法的类,并提供一种在运行时更新和重新加载Schema的方法.我想要一个使用Catalyst本身的不同想法.
感谢您提供的所有帮助.
我只是需要从我的数据库,使得这些转储特定表特定的表(表3是准确了200桌)现在将执行DBIx::Class::Schema.
以下是docs(https://metacpan.org/pod/dbicdump)中的命令:
dbicdump -o dump_directory=./lib -o components='["InflateColumn::DateTime"]' -o preserve_case=1 MyApp::Schema dbi:mysql:database=database_name user pass;
Run Code Online (Sandbox Code Playgroud)
我尝试在database_name之后附加表名但没有运气,它仍然会转储指定数据库中的所有表.需要帮忙.我在文档中找不到任何内容.
还有一个主题问题:
这意味着什么?-o components='["InflateColumn::DateTime"]' -o preserve_case=1我也无法在文档中找到他们的解释.
谢谢
我在数据库中有3个表,简化为:
book book_language language
===== <->> ============== <<-> ========
bookID book_languageID languageID
title bookID language
languageID
Run Code Online (Sandbox Code Playgroud)
使用DBIx::Class::Schema::Loader我生成的架构,对应的Result类在哪里:
Book
BookLanguage
Language
Run Code Online (Sandbox Code Playgroud)
由于某些原因Loader,未在这些表之间检测到many_to_many关系,因此我在此类中定义了自己的关系Language:
package R::RMT::Result::Language;
...
__PACKAGE__->many_to_many('books' => 'book_language_rel', 'bookid_rel');
Run Code Online (Sandbox Code Playgroud)
在Book课堂上:
package R::RMT::Result::Book;
...
__PACKAGE__->many_to_many('languages' => 'book_language_rel', 'languageid_rel');
Run Code Online (Sandbox Code Playgroud)
现在,我希望以此访问所有相关语言:
my $dsn = "DBI:mysql:database=rkBook";
my $schema = R::RMT->connect( $dsn, 'user', 'pwd' );
my $book_rs = $schema->resultset('Book');
say $book_rs->languages();
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:
Can't locate object method "languages" via package "DBIx::Class::ResultSet" at ...
Run Code Online (Sandbox Code Playgroud)
我错了吗?我尝试将文档中的线索拼凑在一起,但显然我弄错了。我从未见过一个完整的many_to_many关系如何运作的例子。
AFAIU,在Result类中定义关系应成为该类的访问者。我如何看到所有派生的访问者?如果我尝试转储ResultSet对象,则Data::Printer只能看到列的访问器,而没有关系的访问器。 …
这里有三个表:product,model和product_modelN:M关系中的产品和模型.
product product_model model
id name product_id model_id id name
------------ ------------------- ----------
p1 Product 1 p1 m1 m1 Model 1
p2 Product 2 p2 m1 m2 Model 2
... p2 m2
Run Code Online (Sandbox Code Playgroud)
我想做什么:找到所有支持Model 2的产品(例如product 2).然后,对于每个产品,显示产品支持的model_ids列表(product 2=> [ m1,m2])
这是我的第一次尝试.我需要N个查询来搜索model_id每个产品.
# 1 query for searching products
my @products = $schema->resultset('Product')->search(
{ 'product_models.model_id' => 'm2' },
{ 'join' => 'product_model' },
)
# N queries for searching …Run Code Online (Sandbox Code Playgroud) 我从DBIx :: Class开始,我有一个想要在DBIx :: Class中的子选择,但我感到困惑,无法构建代码.
我的MySQL选择是这个:
Select name from tblCategory where id = (
Select id from tblCategory where id = (
Select id from tblRadio where name = "RFM"
)
);
Run Code Online (Sandbox Code Playgroud)
我读到DBIx :: Class不支持subselect; 真的吗?如果是这样,你在这样的情况下做了什么?
dbix-class ×10
perl ×10
catalyst ×3
crud ×1
join ×1
mysql ×1
orm ×1
perl-module ×1
prefetch ×1
webforms ×1