我不知道DBIx :: Class ORM是否足以证明整本书的主题,但我想得到一本关于DBIx :: Class ORM细节的书的推荐.
使用以下(简化)MySQL表定义:
create table items (
item_id int unsigned auto_increment primary key,
purchase_date date
) engine = innodb;
create table computers (
item_id int unsigned primary key,
processor_type varchar(50),
foreign key item_fk (item_id) references items (item_id)
on update restrict on delete cascade
) engine = innodb;
create table printers (
item_id int unsigned primary key,
is_duplex boolean,
foreign key item_fk (item_id) references items (item_id)
on update restrict on delete cascade
) engine = innodb;
Run Code Online (Sandbox Code Playgroud)
作为DBIx :: Class的新手,我想建模数据库实体(计算机和打印机都是项目)之间的继承关系,但是使用提供的belongs_to关系类型,这似乎很尴尬,因为与基类的关联是没有隐藏,所以仍然必须手动为两个类创建实体,并且对派生类中的基类属性的访问不同于访问它们自己的属性.
是否有一个优雅的解决方案,可以让我说:
$printer …Run Code Online (Sandbox Code Playgroud) 我只是摆弄了一个复杂的 SQL 查询DBIx::Class(它在幕后用于SQL::AbstractWHERE 子句)。
我使用 BETWEEN 运算符来过滤条目:
# SELECT title FROM tracks WHERE begin BETWEEN '2016-07-01' AND '2016-07-02'
$searchArgs->{'begin'} = { BETWEEN => ['2016-07-01', '2016-07-02' ] };
Run Code Online (Sandbox Code Playgroud)
这将跳过实际的开始日期 2016-07-02。可能是因为这些开始值已超过 2016 年 7 月 2 日午夜 (00:00),因此不在 BETWEEN 范围内(请参阅末尾的示例数据)。
在 SQL 端,这个问题很容易修复:
SELECT title FROM tracks WHERE DATE(begin) BETWEEN '2016-07-01' AND '2016-07-02'
# Note the DATE()-cast of begin
Run Code Online (Sandbox Code Playgroud)
有没有办法通过SQL::Abstract语法来实现这一点?我尝试将列名称作为标量引用($searchArgs->{\"DATE(begin)"})以使其不受影响地通过,但没有成功。
$searchArgs->{'DATE(begin)'}由于没有这样的列“DATE(begin)”,因此仅使用就会触发 SQL 错误。
# Minimal example data
CREATE TABLE test ( title VARCHAR(255), …Run Code Online (Sandbox Code Playgroud) 通常,SQLite 的排序规则区分大小写。所有大写字母都在小写字母之前。但可以通过执行以下操作ORDER BY告诉子句中的 SQLite 忽略这一点:
... ORDER BY foo COLLATE NOCASE ASC
Run Code Online (Sandbox Code Playgroud)
但是我们如何使用 DBIx::Class 来做到这一点呢?
考虑以下示例,该示例在内存中部署一个 SQLite 数据库,其中包含一张表foo和一个列bar。连接使用设置quote_names。它填充值,然后使用ResultSetz Z b B a A将它们取回。all我将在以下所有示例中使用此设置。您需要DBIx::Class和DBD::SQLite来运行它。
use strict;
use warnings;
package Foo::Schema::Result::Foo;
use base 'DBIx::Class::Core';
__PACKAGE__->table("foo");
__PACKAGE__->add_columns( "bar", { data_type => "text" }, );
package Foo::Schema;
use base 'DBIx::Class::Schema';
__PACKAGE__->register_class( 'Foo' => 'Foo::Schema::Result::Foo' );
package main;
my $schema = Foo::Schema->connect(
{
dsn => 'dbi:SQLite:dbname=:memory:', …Run Code Online (Sandbox Code Playgroud) 我目前正在对DBIx :: Class进行一些研究,以便从Class :: DBI迁移我当前的应用程序.老实说,在配置结果类时,我对DBIx :: Class有点失望,使用Class :: DBI我可以通过在没有代码生成器的情况下调用on函数来设置模型上的元数据等我的问题是. ..我可以用DBIX :: Class做同样的事情似乎DBIx :: Class中不支持客户端触发器,或者我没有查看错误的文档?
我有一个包含用户选择的 ID 的列表。在 DBIx::Class 中使用此 ID 列表搜索所有行的最佳方法是什么?
使用 DBIx::Class,我尝试创建一个跨越两个链接表的多对多访问器(甚至只是一个多对关系)。
所讨论的三个数据表是Users、Roles和Pages,以及两个链接表UserRoles和RolePages。这些表是相关的:
Catalyst 帮助程序脚本为我创建了这些关系和访问器:
package MyApp::Schema::Result::User;
__PACKAGE__->has_many(
"user_roles",
"MyApp::Schema::Result::UserRole",
{ "foreign.username" => "self.username" },
{ cascade_copy => 0, cascade_delete => 0 },
);
__PACKAGE__->many_to_many("roles", "user_roles", "role");
package MyApp::Schema::Result::Role;
__PACKAGE__->has_many(
"role_pages",
"MyApp::Schema::Result::RolePage",
{ "foreign.role" => "self.role" },
{ cascade_copy => 0, cascade_delete => 0 },
);
__PACKAGE__->has_many(
"user_roles",
"MyApp::Schema::Result::UserRole",
{ "foreign.role" => "self.role" }, …Run Code Online (Sandbox Code Playgroud) 我想使用DBIx :: Class为SQLite3启用外键支持,以便在更新和删除时使用级联.我在文档中找到了这个http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Storage/DBI/SQLite.pm,但对如何使用它并不是很清楚.
这就是我在脚本中设置Schema.pm和连接字符串的方法.
# Schema.pm
package MyApp::Schema;
use base qw/DBIx::Class::Schema/;
use strict;
use warnings;
our $VERSION = '0.00001';
__PACKAGE__->load_namespaces();
__PACKAGE__->load_components(qw/Schema::Versioned/);
__PACKAGE__->upgrade_directory('sql/');
# connection string in script
use MyApp::Schema;
my $schema = MyApp::Schema->connect('dbi:SQLite:db/myapp.db');
Run Code Online (Sandbox Code Playgroud)
谢谢,
这段代码有什么问题?我正在使用 perl 的DateTime模块DBIx::Class。
my $entry_rs = $schema->resultset('table_name')->search_rs(
{
table_id => $row->table_id,
utc_timestamp => { '<', \'DateTime->now()->subtract(days => 180)' },
},
)->all;
Run Code Online (Sandbox Code Playgroud)
我使用的是 PostgreSQL,utc_timestamp类型是时间戳。如果我计算DateTime->now()->subtract(days => 180)并存储在变量中并替换该值,那么它就可以工作。
错误:
DBIx::Class::Storage::DBI::_dbh_execute(): DBI 异常:DBD::Pg::st 执行失败:错误:列“datetime”不存在?
请帮忙
dbix-class ×10
perl ×10
sqlite ×2
catalyst ×1
class-dbi ×1
database ×1
many-to-many ×1
postgresql ×1