已经安装了Postgres DB.我没有使用系统perl我在"/ srv/data203806/Migration/CPAN/localperl/bin"中安装了另一个perl.当我尝试安装时,它要求PATH TO pg_config:
[root1@frmrszvwb023 bin]# ./cpan install DBD::Pg
Reading '/root/.cpan/Metadata'
Database was generated on Fri, 07 Mar 2014 03:53:02 GMT
Running install for module 'DBD::Pg'
Running make for T/TU/TURNSTEP/DBD-Pg-3.0.0.tar.gz
Checksum for /root/.cpan/sources/authors/id/T/TU/TURNSTEP/DBD-Pg-3.0.0.tar.gz ok
CPAN.pm: Building T/TU/TURNSTEP/DBD-Pg-3.0.0.tar.gz
Configuring DBD::Pg 3.0.0
Path to pg_config?
No POSTGRES_HOME defined, cannot find automatically
Warning: No success on command[/srv/data203806/MUXmh-Migration/CPAN/localperl/bin/perl Makefile.PL]
'YAML' not installed, will not store persistent state
TURNSTEP/DBD-Pg-3.0.0.tar.gz
/srv/data203806/MUXmh-Migration/CPAN/localperl/bin/perl Makefile.PL -- NOT OK
Running make test
Make had some problems, won't test
Running …Run Code Online (Sandbox Code Playgroud) 我正在努力让手动交易按照DBD :: Pg中的说明工作,或者我只是误解了所述文档.
我的理解是,如果我想手动管理事务,我应该关闭AutoCommit.
$dbh->{AutoCommit} = 0;
$dbh->begin_work;
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我会遇到连续的错误
DBD::Pg::db begin_work failed: Already in a transaction
Run Code Online (Sandbox Code Playgroud)
要使其工作,我需要首先打开AutoCommit.
$dbh->{AutoCommit} = 1;
$dbh->begin_work;
Run Code Online (Sandbox Code Playgroud)
但这似乎与任何文档都不一致.
我只是误解了吗?
我有守护程序脚本,它在while循环中永远运行.我有一个准备好的语句,这个语句在每个循环上执行.
例:
my $dbh;
sub get_dbh {
return DBI->connect(...);
}
my $dbh = get_dbh();
my $sth = $dbh->prepare("SELECT ....") or die $DBI::errstr;
while (1) {
// is connection still there??
//if (!$dbh->ping) {
// $dbh = get_dbh();
//}
$sth->execute('param1');
// do some other things ... sleep between 0 and 3600
}
Run Code Online (Sandbox Code Playgroud)
如果准备好的声明是在几小时前准备的,则会出现(或可能发生)问题.连接可能会死,我的执行也会死.在每次执行之前检查$ dbh-> ping看起来像是一种过度杀伤.
MySQL支持mysql_auto_reconnect,它确实有效.DBD :: Pg没有类似的东西.我读到了关于DBI :: Apache但我认为它依赖于mod_perl等.它显然是针对Web应用程序的.
是否有"最佳实践"方法来检查连接状态并在需要时重新连接?#
我可以在每个循环上准备语句,但这不是解决方案,而只是解决问题的方法.
经过一些更新(系统和brew - 我不知道哪个原因)后,Perl 的 DBD:Pg 建立与本地 Postgresql 实例的连接速度很慢。连接建立后执行查询并不慢。没有其他实用程序或驱动程序(psql、jdbc、.NET)的连接速度较慢。
此代码创建到本地 postgres 实例的连接:
#!/usr/bin/env perl
use strict;
use DBI;
use DBD::Pg;
use Carp;
my $appname = "test-connect";
my $host = "127.0.0.1";
my $port = "5432";
my $dbname = "postgres";
my $dbuser = "postgres";
my $password = "";
my $sslmode = "disable";
carp( "************* - DBI trace settings (before)= " . (DBI->trace() // '(none)'));
DBI->trace(DBD::Pg->parse_trace_flag('pglibpq'));
carp( "************* - DBI trace settings (after)= " . (DBI->trace() // '(none)'));
# Create the connection
carp("************* - …Run Code Online (Sandbox Code Playgroud) 我从命令行执行.cgi(作为有权访问数据库的用户)
install_driver(Pg)失败:无法在@INC中找到DBD/Pg.pm(@INC包含:/ Library/Perl/5.12/darwin-thread-multi-2level /Library/Perl/5.12/Network/Library/Perl/5.12/darwin-thread-multi-2level /Network/Library/Perl/5.12 /Library/Perl/Updates/5.12.4 /System/Library/Perl/5.12/darwin-thread-multi-2level/System/Library/Perl/5.12 /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level /System/Library/Perl/Extras/5.12.)at(eval 4)3行.也许DBD :: Pg perl模块还没有已完全安装,或者'Pg'的大写不正确.
cpan -D DBD :: Pg显示
DBD :: PG
用于DBI的Postgres驱动程序T/TU/TURNSTEP/DBD-Pg-2.19.2.tar.gz /opt/local/lib/perl5/site_perl/5.12.4/darwin-thread-multi-2level/DBD/Pg.pm已安装:2.19.2 CPAN:2.19.2最新DBD :: Pg开发人员(DBDPG)dbd-pg@perl.org
尝试通过PERL5LIB或PERLLIB导出上述路径没有不同的结果.
.cgi引用/ usr/bin/perl,它告诉我们
这是为darwin-thread-multi-2level构建的perl 5,版本12,subversion 4(v5.12.4)(有2个已注册的补丁,有关详细信息,请参阅perl -V)
我喜欢永久地将模块路径设置为安装DBD :: Pg的路径(/ opt/...).我想知道为什么错误输出目录列表没有提到.
我通过cpanm安装了DBD :: Pg.
我使用的是Mac OS X Mountain Lion.
我有这个代码:
if($update[$entity_id])
{
my $sql = "UPDATE cache SET date = '?', value = '?' WHERE item_id = ? AND level = ? AND type = ?;";
}
else
{
my $sql = "INSERT INTO cache (date, value, item_id, level, type) VALUES ('?','?',?,?,?);";
}
my $db = $self->{dbh}->prepare(q{$sql}) or die ("unable to prepare");
$db->execute(time2str("%Y-%m-%d %X", time), $stored, $entity_id, 'entity', 'variance');
Run Code Online (Sandbox Code Playgroud)
但是当它想要运行更新时,我收到此错误:
DBD :: Pg :: st执行失败:当需要0时,使用5个绑定变量调用.
为什么?
dbd-pg ×6
perl ×5
postgresql ×5
cgi-bin ×1
connection ×1
database ×1
dbd ×1
dbi ×1
libpq ×1
macos ×1
perl-module ×1
reconnect ×1