标签: dbix-class

哪本书对DBIx :: Class有最好的讨论?

我不知道DBIx :: Class ORM是否足以证明整本书的主题,但我想得到一本关于DBIx :: Class ORM细节的书的推荐.

perl dbix-class

4
推荐指数
1
解决办法
1494
查看次数

如何建模与DBIx :: Class的is-a关系?

使用以下(简化)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)

database perl dbix-class

4
推荐指数
1
解决办法
391
查看次数

为什么DBIx :: Class不能创建多对多访问器?

虽然创建从数据库架构表之间的许多一对多的关系并不创建.

这是一个主要问题吗?

是否有可能从表结构中检测到存在多对多关系并自动在模式类中创建相应的代码?

perl dbix-class

4
推荐指数
1
解决办法
855
查看次数

DBIx::Class / SQL::Abstract 将 SQL 函数应用于 WHERE 子句中的列

我只是摆弄了一个复杂的 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)

postgresql perl dbix-class

4
推荐指数
1
解决办法
443
查看次数

如何使用 SQLite 使 DBIx::Class 忽略 ORDER BY 中的大小写?

通常,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::ClassDBD::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)

sqlite perl dbix-class

4
推荐指数
1
解决办法
564
查看次数

从Class :: DBI移动到DBIx :: Class

我目前正在对DBIx :: Class进行一些研究,以便从Class :: DBI迁移我当前的应用程序.老实说,在配置结果类时,我对DBIx :: Class有点失望,使用Class :: DBI我可以通过在没有代码生成器的情况下调用on函数来设置模型上的元数据等我的问题是. ..我可以用DBIX :: Class做同样的事情似乎DBIx :: Class中不支持客户端触发器,或者我没有查看错误的文档?

perl class-dbi dbix-class

3
推荐指数
1
解决办法
674
查看次数

使用 DBIx::Class 中的 ID 列表进行搜索

我有一个包含用户选择的 ID 的列表。在 DBIx::Class 中使用此 ID 列表搜索所有行的最佳方法是什么?

perl dbix-class

3
推荐指数
1
解决办法
827
查看次数

使用 DBIx::Class 的多对多对多访问器

使用 DBIx::Class,我尝试创建一个跨越两个链接表的多对多访问器(甚至只是一个多对关系)。

所讨论的三个数据表是UsersRolesPages,以及两个链接表UserRolesRolePages。这些表是相关的:

  • 一个用户有多个用户角色
  • 一个角色有多个UserRoles
  • 一个角色有多个角色页面
  • 一个Page有很多RolePage

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)

perl many-to-many catalyst dbix-class

3
推荐指数
1
解决办法
1521
查看次数

DBIx :: Class如何为SQLite启用PRAGMA foreign_keys?

我想使用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)

谢谢,

sqlite perl dbix-class

3
推荐指数
1
解决办法
562
查看次数

Perl DBIx::Class DateTime 减法

这段代码有什么问题?我正在使用 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”不存在?

请帮忙

perl dbix-class

3
推荐指数
1
解决办法
979
查看次数