我在CPAN上遵循Rose :: DB :: Object教程并设置了三个包.
package My::DB::Object;
use My::DB;
use base qw(Rose::DB::Object);
sub init_db { My::DB->new }
package My::DB;
use base qw(Rose::DB);
...
package Motorcycle;
use base 'My::DB::Object';
__PACKAGE__->meta->setup
(
...
);
__PACKAGE__->meta->make_manager_class('motorcycles');
Run Code Online (Sandbox Code Playgroud)
在申请中:
package main;
use Motorcycle;
use Mojolicious::Lite;
Run Code Online (Sandbox Code Playgroud)
无法使用此错误进行编译:
My/DB/Object did not return a true value <eval 2> line 2…
Run Code Online (Sandbox Code Playgroud)
问候和感谢.
我在这里可能是错的,但看起来这里的标准是相互冲突的。
MySQL 将存储的日期时间“0000-00-00 00:00:00”视为等同于 NULL。(更新 - 似乎仅当日期时间定义为 NOT NULL 时)
但是 Rose::DB::Object 对 MySQL DATETIME 字段使用 DateTime,并且尝试从“0000-00-00”设置空 DATETIME 会在 DateTime 模块中引发异常。即,我无法创建年 0 月 0 日的 DateTime 对象,因为这会在 DateTime 模块中引发异常。
我签入了 Rose::DB::Object::Metadata::Column::Datetime,但在创建条目或检索时看不到显式处理 NULL DateTime 的方法。
我错过了什么吗?
即,Rose::DB::Object 可以处理 NULL datetime (MySQL) 字段,即使 DateTime(Perl 模块)不能。
示例代码:
#!/usr/bin/perl
use strict;
use warnings;
use lib 'lib';
use RoseDB::dt_test;
my $dt_entry = RoseDB::dt_test->new();
$dt_entry->date_time_field('0000-00-00');
$dt_entry->save;
1;
__END__
# definition of table as stored in DB
mysql> show create table dt_test \G
*************************** 1. row *************************** …Run Code Online (Sandbox Code Playgroud) 我有一个TT插件,可以完成琐碎的独特ID:
sub get_unique_uid_tt {
my ( $classname, $o ) = @_;
my %h;
foreach my $item ( @{$o} ) {
unless ( exists $h{ $item->id } ) {
$h{ $item->id } = 1;
}
}
return keys %h;
}
Run Code Online (Sandbox Code Playgroud)
模板调用只是:
[% Namespace.get_unique_uid_tt( data.users ) %]
Run Code Online (Sandbox Code Playgroud)
"data"是一个RDB对象,用户是其关系之一.我已经验证".users"直接在Perl中返回一个列表,无论该关系是否有一个或多个元素.
但是,TT似乎返回单元素列表的元素,同时正确返回多个元素的列表.
我查了一下,发现你可以用".list"强制列表上下文:
[% Namespace.get_unique_uid_tt( data.users.list ) %]
Run Code Online (Sandbox Code Playgroud)
对于单元素列表,这不起作用,因为Data :: Dumper显示:
$VAR1 = [
{
'value' => 1,
'key' => '__xrdbopriv_in_db'
},
{
'value' => bless(
... snip ...
),
'key' => 'db'
},
{ …Run Code Online (Sandbox Code Playgroud)