标签: dbi

如何检查数据库查询是否会返回结果?

我们的网站使用Perl为人力资源人员提供了一个简单的机制,可以将空缺发布到我们的网站.它是由第三方开发的,但是它们很久以来就被触碰了,遗憾的是我们内部没有任何Perl技能.当营销人员规避他们的内部IT团队时,就会发生这种情况!

我需要对此应用程序进行简单的更改.目前,职位空缺页面上写着"我们目前有以下职位空缺:",无论是否有职位空缺!因此我们想要更改它,以便仅在适当的时间显示此行.

显然,我可以开始学习一点Perl,但我们已经在计划一个替换站点,它肯定不会使用Perl.因此,对于具有这些技能的人来说,解决方案将是微不足道的,我想我会要求一些有针对性的帮助.

以下是列出职位空缺的程序的开始.

sub list {
  require HTTP::Date;
  import HTTP::Date;

  my $date = [split /\s+/, HTTP::Date::time2iso(time())]->[0];

  my $dbh = DBI->connect($dsn, $user, $password)
    || die "cannot connect to $database: $!\n";

  my $sql = <<EOSQL;
SELECT * FROM $table where expiry >= '$date' order by expiry
EOSQL

  my $sth = $dbh->prepare($sql);
  $sth->execute();


  while (my $ref = $sth->fetchrow_hashref()) {
    my $temp  = $template;
    $temp     =~ s#__TITLE__#$ref->{'title'}#;

    my $job_spec = $ref->{'job_spec'};

...etc...
Run Code Online (Sandbox Code Playgroud)

关键是while (my $ref = $sth->fetchrow_hashref()) {.我想这是在说"我可以从退回的记录集中取出另一个空位......".如果我在此行之前放置我的print语句,它将始终显示; 在这条线之后,每个空缺都会重复.

如何确定是否有一些空缺要显示,而不会过早地移动返回的记录集?

我总是可以在while循环中复制代码,并将它放在if()语句中(在while循环之前),它也包含我的print语句.但我更愿意采用更简单的方法 …

perl rows dbi

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

如何使用Perl的DBD :: Pg插入空字段?

我有一个Perl脚本根据管道分隔的文本文件将数据插入Postgres.有时,字段为空(如预期的那样).但是,Perl将此字段设置为空字符串,并且Postgres插入语句失败.

这是一段代码:


use DBI;

#Connect to the database.
$dbh=DBI->connect('dbi:Pg:dbname=mydb','mydb','mydb',{AutoCommit=>1,RaiseError=>1,PrintError=>1});

#Prepare an insert.
$sth=$dbh->prepare("INSERT INTO mytable (field0,field1) SELECT ?,?");

while (<>){
    #Remove the whitespace
    chomp;

    #Parse the fields.
    @field=split(/\|/,$_);

    print "$_\n";

    #Do the insert.
    $sth->execute($field[0],$field[1]);
}
Run Code Online (Sandbox Code Playgroud)

如果输入是:

a|1
b|
c|3

编辑:改为使用此输入.

a|1|x
b||x
c|3|x

它会失败的b|.

DBD::Pg::st execute failed: ERROR:  invalid input syntax for integer: ""

我只是想让它在field1上插入一个null.有任何想法吗?

编辑:我在最后一分钟简化了输入.旧的输入实际上由于某种原因使它工作.所以现在我将输入改为使程序失败的东西.另请注意,field1是可以为null的整数数据类型.

postgresql perl dbi

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

这种替代机制进行DBI查询有什么问题?

DBI文档中,这是多次执行查询的推荐代码:

$sth = $dbh->prepare_cached($statement);
$sth->execute(@bind);
$data = $sth->fetchall_arrayref(@attrs);
$sth->finish;
Run Code Online (Sandbox Code Playgroud)

但是,我看到许多*查询方法允许传递一个准备好的和缓存的语句句柄来代替查询字符串,这使得这成为可能:

$sth = $dbh->prepare_cached($statement);
$data = $dbh->selectall_arrayref($sth, \%attrs, @bind);
Run Code Online (Sandbox Code Playgroud)

这种方法有什么问题吗?我还没有看到它在野外使用过.

FWIW,我对这两个实现进行了基准测试.第二种方法fetchall_arrayref在第一次实现selectall_arrayref中使用第二次执行时查询连续两行时,速度略微提高(4%).

*支持此功能的查询方法的完整列表如下:

  • selectrow_arrayref - 使用预准备语句的常规方法是fetchrow_arrayref
  • selectrow_hashref - ""fetchrow_hashref
  • selectall_arrayref - ""fetchall_arrayref
  • selectall_hashref - ""fetchall_hashref
  • selectcol_arrayref(实际上没有计数,因为它没有使用第一个代码路径的并行方法,如上所述 - 所以使用这个方法的预准备语句的唯一方法是使用上面的第二个代码路径)

perl bind dbi weak-typing

5
推荐指数
2
解决办法
1473
查看次数

使用Perl/DBI在MySQL表中截断utf-8字符串

我试图使用perl/DBI将utf-8字符串写入MySQL表.由于某种原因,字符串在第一个非ascii字符处被截断.

例如,如果我设置下表:

CREATE DATABASE testdb DEFAULT CHARSET=utf8;
CREATE TABLE testdb.testtable (textval CHAR(30)) DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

然后运行以下perl代码:

#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect('DBI:mysql:host=localhost;database=testdb', 'testuser', 'somepassword', {mysql_enable_utf8 => 1}) or die $DBI::errstr;
$dbh->do('SET NAMES utf8');
$dbh->do("INSERT INTO testtable (textval) VALUES ('the N\xFCrburgring')");
Run Code Online (Sandbox Code Playgroud)

它实际上写的是"N".(什么时候应该写"纽伯格林")

查看MySQL查询日志,我看到:

271 Query INSERT INTO testtable (textval) VALUES ('the Nürburgring')
Run Code Online (Sandbox Code Playgroud)

所以字符串完整地到达DB服务器.

如果我直接在MySQL控制台中输入相同的查询:

INSERT INTO testtable (textval) VALUES ('the Nürburgring');
Run Code Online (Sandbox Code Playgroud)

整个字符串都正确写入.知道我做错了什么吗?

mysql perl utf-8 dbi

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

如何在Perl中的一个连接字符串中连接mysql数据库和Sybase数据库?

我已连接两个数据库,但使用了两个连接字符串.是否有可能通过使用一个连接字符串进行连接.

mysql perl sybase dbi

5
推荐指数
0
解决办法
928
查看次数

所有perl版本都支持旧模块吗?

我在所有服务器上安装了Perl 5.8,并希望使用DBI和DBD :: Oracle模块来访问我们的数据库.我主要担心的是更新版本的perl DBI和DBD模块将停止使用5.8.然后我必须将每台服务器升级到最新的perl版本.

我的问题是perl本身成为更高版本,并且为他们开发的模块是否仍然可以向后兼容?"如果我创建文档说运行"cpan -i DBI",如果最新版本的DBI不能与5.8一起运行,那么"CPAN不会包含Perl的所有古老版本和补丁级别".

perl cpan dbi perl5.8

5
推荐指数
3
解决办法
1179
查看次数

如何查询某些行的sqlite,即将其划分为页面(perl DBI)

对不起我的noob问题,我正在编写一个带有sqlite数据库的perl web应用程序.我希望能够在我的应用程序中显示可能获得数千行的查询结果 - 这些应该在页面中分割 - 路由应该像/ webapp/N - 其中N是页码.使用DBI查询sqlite数据库的正确方法是什么,以便仅获取相关行.

例如,如果我每页显示25行,那么我想在第一页中查询数据库1-25行,在第二页中查询26-50等....

sqlite perl dbi

5
推荐指数
2
解决办法
1787
查看次数

Perl - DBI和.pgpass

我可以使用以下命令成功创建与Postgres数据库的连接:

my $settings = {
    host => 'myhost',
    db => 'mydb',
    user => 'myuser',
    passwd => 'mypasswd'
};

my $connection = DBI->connect(
    'DBI:Pg:dbname=' . $settings->{'db'} . ';host=' . $settings->{'host'},
    $settings->{'user'},
    $settings->{'passwd'},
    {
        RaiseError => 1,
        ShowErrorStatement => 0,
        AutoCommit => 0
    }
) or die DBI->errstr;
Run Code Online (Sandbox Code Playgroud)

但是我在Perl模块中留下了有价值的登录凭据(是的,我更改了它们).目前,我用psql交互式方式发出查询.为了节省必须记住我的用户名/密码,我已将凭据放在具有权限600的文件(〜/ .pgpass)中.文件如下所示:

# host:port:database:user:passwd
myhost:5432:mydb:myuser:mypasswd
Run Code Online (Sandbox Code Playgroud)

如何安全地使用此文件("$ENV{HOME}/.pgpass")和DBI模块来隐藏我的凭据?可以吗?什么是最佳做法?

unix postgresql bash perl dbi

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

更优雅的方法来构造添加WHERE和使用占位符的SQL

构造具有各种WHERE条件的sql的最佳方法是什么?我的解决方案看起来很难看

my ($where, @values);
if ($phone_number)
{
    $where = 'AND pnone_number=?';
    @values = ($from, $till, $phone_number);
}
else 
{
    $where = '';
    @values = ($from, $till);
}
my $sql = 'SELECT * FROM calls WHERE time between ? AND ? '.$where.' ORDER BY time';
my $res = $dbh->selectall_arrayref($sql, undef, @values) or warn 'error';
Run Code Online (Sandbox Code Playgroud)

perl dbi

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

perls dbi在哪里:Oracle table_info/column_info从哪里获取信息?

我有一个(至少我认为是这样)简单的任务:按列名,数据类型和长度比较2个表,以验证它们到目前为止具有相同的结构.它应该在现有的perl脚本中完成,该脚本连接到两个不同的数据库.

首先,我简单地查询每个数据库user_tab_columns并比较结果.现在我发现了user_tab_columns现实中的困难方式,但必须通过分析表(http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_4462.htm#REFRN26277)进行更新.绝对不知道.

describe得到实际的表定义,但似乎没有通过perls dbi:Oracle,所以我偶然发现了table_info()column_info()方法.但他们从哪里获取信息?如果他们只是查询*_tab_columns,它们对我没用.

我不能简单地测试,因为我还没有设法传递正确的参数.在DBI文件说,这是根据数据库驱动程序.在甲骨文DBD文档也不是很有益的,以我为好,试错,到目前为止导致让所有物体或什么都没有.

目前,我想执行的describe通过sqlplus通过一个Perl的系统调用和解析输出....但有是一个更好的办法.

编辑:

user_tab_columns如果选中正确的列,视图将按预期工作(请参阅下面的注释).

oracle perl dbi

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

标签 统计

dbi ×10

perl ×10

mysql ×2

postgresql ×2

bash ×1

bind ×1

cpan ×1

oracle ×1

perl5.8 ×1

rows ×1

sqlite ×1

sybase ×1

unix ×1

utf-8 ×1

weak-typing ×1