标签: dbix-class

Perl DBIx :: Class是否可以覆盖从数据库中检索列的方式?

我从来没有使用DBIx :: Class直到今天,所以我对它完全陌生.

我不确定这是否可行,但基本上我的SQLite数据库中有一个表中有一个时间戳列.timestamp列的默认值是"CURRENT_TIMESTAMP".SQLite将其存储在GMT时区中,但我的服务器位于CDT时区.

我的SQLite查询在正确的时区获取时间戳是这样的:

select datetime(timestamp, 'localtime') from mytable where id=1;
Run Code Online (Sandbox Code Playgroud)

我想知道在我的DBIx架构中是否有可能"MyTable"强制它在每次从数据库中检索"timestamp"字段时应用datetime函数?

在使用 - > search()函数时,在食谱中看起来可以这样做,但我想知道如果我使用search(),find(),all(),是否可以这样做, find_or_new(),或者从数据库中提取此列的任何函数,它会将datetime()SQLite函数应用于它吗?

DBIx :: Class似乎有很好的文档 - 我认为我只是如此新鲜,我找不到合适的地方/事物来搜索.

提前致谢!

sqlite perl dbix-class

5
推荐指数
1
解决办法
793
查看次数

如何使用Test :: DBIx :: Class为测试套件正确加载fixture?

我有一堆测试我的DBIx :: Class架构,我使用的是Test :: DBIx :: Class.这很棒,因为它为我提供了有用的测试功能和加载夹具.它还有一个Test :: mysqld特性,所以我可以动态创建一个测试mysqld实例,部署模式,加载fixture和测试.但是如果我有一堆测试脚本,启动服务器似乎很愚蠢,在每个脚本开始时通过构造函数实例化时部署和加载fixture.

创建测试数据库并在测试期间填充它的最佳方法是什么?

perl unit-testing dbix-class

5
推荐指数
1
解决办法
688
查看次数

DBIx :: Class可以与存储过程而不是表一起使用吗?

通过返回结果集而不是表或视图的mssql存储过程向我提供了从db读取的访问权限.但我希望能够使用ORM读取数据.

我试图使用DBIx::Class::ResultSource::View过程调用(例如EXEC my_stored_proc ?)作为自定义查询,但这不起作用,因为它试图将过程调用转换为select语句.

有人有另一个建议吗?

perl stored-procedures dbix-class

5
推荐指数
1
解决办法
994
查看次数

使用DBIx :: Class :: ResultSet的find_or_create方法时如何避免竞争条件?

从以下文档find_or_create:

注意:因为find_or_create()从数据库中读取,然后可能根据结果插入,所以此方法受竞争条件限制.另一个进程可以在查找完成之后和创建开始之前在表中创建记录.要避免此问题,请在事务中使用find_or_create().

仅仅find_or_create()在PostgreSQL中使用一个事务就足够了吗?

database postgresql perl dbix-class

5
推荐指数
1
解决办法
819
查看次数

DBIx :: Class示例

在下面的示例中:

my $rs = $schema->resultset('CD')->search(
{
  'artist.name' => 'Bob Marley'
  'liner_notes.notes' => { 'like', '%some text%' },
},
{
  join     => [qw/ artist liner_notes /],
  order_by => [qw/ artist.name /],
}
);
Run Code Online (Sandbox Code Playgroud)

DBIx cookbook说这是将生成的sql:

# Equivalent SQL:
# SELECT cd.*, artist.*, liner_notes.* FROM cd
# JOIN artist ON cd.artist = artist.id
# JOIN liner_notes ON cd.id = liner_notes.cd
# WHERE artist.name = 'Bob Marley'
# ORDER BY artist.name
Run Code Online (Sandbox Code Playgroud)

但是从菜谱的其余部分开始,我一直认为查询只会选择cd.*,除非当然使用prefetch是这样的:

my $rs = $schema->resultset('CD')->search(
{
  'artist.name' => 'Bob Marley'
  'liner_notes.notes' …
Run Code Online (Sandbox Code Playgroud)

perl orm catalyst dbix-class

5
推荐指数
1
解决办法
1199
查看次数

DBIx::Class 如何处理布尔值?

我在 perl 脚本中使用 DBIx::Class 与 sqlite 数据库进行交互。

在进行插入/搜索时,DBIx::Class 会考虑“真”和“假”什么?

例如:

$schema->resultset('SomeObject')->create({ some_boolean => 1, primary_key => 1 });

$schema->resultset('SomeObject')->search({ some_boolean => 'true' });

感谢任何帮助或文档(我无法在 DBIx::Class 文档中找到它,但也许我遗漏了一些东西。

提前致谢。

perl orm perl-module dbix-class

5
推荐指数
1
解决办法
948
查看次数

DBIx :: Class获取dbh

我在我正在构建的Catalyst应用程序中使用DBIx :: Class.它工作得很好,但有时我需要使用我自己开发的自己的db函数,这些函数非常符合我的需求.因此,我需要一个dbh.但是,因为我已经在使用,所以我知道它已经有一个正在使用的dbh.为了避免与数据库建立另一个不必要的连接,我想只使用已经创建的dbh .我知道DBIx ::类::存储:: DBI模块有两个方法和,但我真的不知道有什么区别两者之间,如果他们获得访问胸径的最佳途径.谁能告诉我什么是最好的方式来获得胸径会在一个应用程序?我更喜欢一种方法,我可以将其存储在存储区中,如下所示:DBIx::ClassDBIx::Classdbhdbh_doDBIx::ClassCatalyst

sub dbh :Private { 
    my ($self, $c) = @_;
    $c->stash->{dbh} = #get dbh from DBIx::Class here
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

database perl catalyst dbix-class

5
推荐指数
1
解决办法
2079
查看次数

Catalyst&Perl - 在运行时生成模型

我正在开发一个将在运行时生成数据库表的应用程序.我正在使用Catalyst和DBIC,我需要在生成新表时生成新的ResultSet.这个新的ResultSet必须作为Catalyst模型添加,所以我可以,$c->model('DB::NewFoo')但我需要在运行时发生这种情况.

表生成和ResultSet生成不是问题,我需要的是在运行时将那些新生成的ResultSet添加到Model中,以便我可以在进一步的请求中调用它们.

到目前为止,我的想法是创建一个控制DBI::Class::Schema,提供访问器方法的类,并提供一种在运行时更新和重新加载Schema的方法.我想要一个使用Catalyst本身的不同想法.

感谢您提供的所有帮助.

perl catalyst dbix-class

5
推荐指数
1
解决办法
136
查看次数

无法使用DBIx :: Class :: Schema :: Versioned创建非虚拟视图

我正在使用DBIx :: Class :: Schema :: Versioned,我想在数据库中创建一个新视图作为表.设置__PACKAGE__->result_source_instance->is_virtual(1);正确使用模式中的视图定义(不创建表),但是当我设置时,__PACKAGE__->result_source_instance->is_virtual(0);没有在数据库中创建表并尝试获取结果集会抛出"关系不存在"错误(这是预期的).

我在文档中找不到任何关于如何在DBIx :: Class :: Schema :: Versioned中创建视图的引用.当我在不包含视图的旧版本和新版本之间运行差异时,该文件sql/MyProject-Schema-38-PostgreSQL.sql包含用于创建视图的代码:

-- View: unlocked_pages
DROP VIEW unlocked_pages;
CREATE VIEW unlocked_pages ( page_id, username ) AS ...
Run Code Online (Sandbox Code Playgroud)

但是,包含2版本之间差异的文件显示为空,因此在升级模式时,除了在dbix_class_schema_versions中添加新版本号外,不会执行任何操作.这些是sql/MyProject-Schema-37-38-PostgreSQL.sql的内容:

-- Convert schema 'sql/MyProject-Schema-37-PostgreSQL.sql' to 'sql/MyProject-Schema-38-PostgreSQL.sql':;

-- No differences found;
Run Code Online (Sandbox Code Playgroud)

我正在使用postgresql,Schema.pm中的定义是

package MyProject::Schema;

# based on the DBIx::Class Schema base class
use base qw/DBIx::Class::Schema/;

use strict;
use warnings;

our $VERSION = 38;

# This will load any classes within
# MyProject::Schema::Result and MyProject::Schema::ResultSet (if …
Run Code Online (Sandbox Code Playgroud)

postgresql perl database-schema dbix-class

5
推荐指数
1
解决办法
76
查看次数

有没有办法使用现有的 DBI 数据库句柄连接到 DBIx::Class 架构?

如果我已经有一个活动的 DBI 数据库句柄,有没有办法使用该数据库句柄实例化 DBIx::Class 模式,而不是创建一个新连接,例如

my $schema = MyApp::Schema->connect($dbh);
Run Code Online (Sandbox Code Playgroud)

(这是因为某些遗留代码使用了一些较新的基于 DBIC 的代码。不,我无法连接到架构并将架构的数据库句柄传递给遗留代码,并且不,我无法重写遗留代码以使用 DBIC .)

perl dbix-class

5
推荐指数
1
解决办法
177
查看次数