我从来没有使用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似乎有很好的文档 - 我认为我只是如此新鲜,我找不到合适的地方/事物来搜索.
提前致谢!
我有一堆测试我的DBIx :: Class架构,我使用的是Test :: DBIx :: Class.这很棒,因为它为我提供了有用的测试功能和加载夹具.它还有一个Test :: mysqld特性,所以我可以动态创建一个测试mysqld实例,部署模式,加载fixture和测试.但是如果我有一堆测试脚本,启动服务器似乎很愚蠢,在每个脚本开始时通过构造函数实例化时部署和加载fixture.
创建测试数据库并在测试期间填充它的最佳方法是什么?
通过返回结果集而不是表或视图的mssql存储过程向我提供了从db读取的访问权限.但我希望能够使用ORM读取数据.
我试图使用DBIx::Class::ResultSource::View过程调用(例如EXEC my_stored_proc ?)作为自定义查询,但这不起作用,因为它试图将过程调用转换为select语句.
有人有另一个建议吗?
从以下文档find_or_create:
注意:因为find_or_create()从数据库中读取,然后可能根据结果插入,所以此方法受竞争条件限制.另一个进程可以在查找完成之后和创建开始之前在表中创建记录.要避免此问题,请在事务中使用find_or_create().
仅仅find_or_create()在PostgreSQL中使用一个事务就足够了吗?
在下面的示例中:
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 脚本中使用 DBIx::Class 与 sqlite 数据库进行交互。
在进行插入/搜索时,DBIx::Class 会考虑“真”和“假”什么?
例如:
$schema->resultset('SomeObject')->create({ some_boolean => 1, primary_key => 1 });
$schema->resultset('SomeObject')->search({ some_boolean => 'true' });
感谢任何帮助或文档(我无法在 DBIx::Class 文档中找到它,但也许我遗漏了一些东西。
提前致谢。
我在我正在构建的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)
谢谢!
我正在开发一个将在运行时生成数据库表的应用程序.我正在使用Catalyst和DBIC,我需要在生成新表时生成新的ResultSet.这个新的ResultSet必须作为Catalyst模型添加,所以我可以,$c->model('DB::NewFoo')但我需要在运行时发生这种情况.
表生成和ResultSet生成不是问题,我需要的是在运行时将那些新生成的ResultSet添加到Model中,以便我可以在进一步的请求中调用它们.
到目前为止,我的想法是创建一个控制DBI::Class::Schema,提供访问器方法的类,并提供一种在运行时更新和重新加载Schema的方法.我想要一个使用Catalyst本身的不同想法.
感谢您提供的所有帮助.
我正在使用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) 如果我已经有一个活动的 DBI 数据库句柄,有没有办法使用该数据库句柄实例化 DBIx::Class 模式,而不是创建一个新连接,例如
my $schema = MyApp::Schema->connect($dbh);
Run Code Online (Sandbox Code Playgroud)
(这是因为某些遗留代码使用了一些较新的基于 DBIC 的代码。不,我无法连接到架构并将架构的数据库句柄传递给遗留代码,并且不,我无法重写遗留代码以使用 DBIC .)
dbix-class ×10
perl ×10
catalyst ×3
database ×2
orm ×2
postgresql ×2
perl-module ×1
sqlite ×1
unit-testing ×1