标签: dbi

如何获取使用DBI插入的最后一行?

如何获取使用DBI(DBD :: mysql)插入的最后一行?

代码示例:

my $sth = $dbh->prepare('INSERT INTO a ( x, y, z ) VALUES ( ?, ?, ? )');
$sth->execute( $x, $y, $z );
Run Code Online (Sandbox Code Playgroud)

如何访问上述prepare语句插入的数据?我需要获取主ID(AUTOINCREMENT)值.

更新:

来自DBD :: mysql文档:

访问此属性的另一种方法是via $dbh->{'mysql_insertid'}.

感谢Mannin0rd的回答.:-)

perl dbi

34
推荐指数
3
解决办法
3万
查看次数

警告:MYSQL_OPT_RECONNECT 已弃用,并将在未来版本中删除

正如我在这里看到的,从 MySQL 8.0.34 开始,自动重新连接功能已被弃用。我有很多 Perl 脚本连接到 MySQL 数据库,例如:

my $dbh = DBI->connect( "DBI:mysql:database=$db_name;host=$db_host",
                         $db_user, $db_pass, {'RaiseError' => 1,
                         mysql_enable_utf8 => 1} );
Run Code Online (Sandbox Code Playgroud)

现在发出警告:

警告:MYSQL_OPT_RECONNECT 已弃用,并将在未来版本中删除。

我尝试将 Perl 代码更改为:

my $dbh = DBI->connect( "DBI:mysql:database=$js_db_name;host=$js_db_host",
                         $js_db_user, $js_db_pass, {'RaiseError' => 1,
                         mysql_enable_utf8 => 1, mysql_auto_reconnect => 0} );
Run Code Online (Sandbox Code Playgroud)

但警告仍然存在。我已尝试按照此处的建议添加reconnect=false[client]配置文件的部分。也没有成功。/etc/my.cnf

我什至尝试更改 MySQL 的 Perl DBI 驱动程序,其代码如下 ( mysql.pm):

    if ($this && ($ENV{MOD_PERL} || $ENV{GATEWAY_INTERFACE})) {
        $this->{mysql_auto_reconnect} = 1;
    }
Run Code Online (Sandbox Code Playgroud)

避免将mysql_auto_reconnect属性设置为1. 但这也行不通。可能还有额外的代码,但如果可能的话我会避免更改标准库。 …

mysql perl dbi

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

我如何知道Perl DBI查询返回多少行?

我试图基本上用Perl搜索数据库来判断是否有一个具有特定ID的项目.此搜索不返回任何行,但也可以返回一行.

我有以下代码:

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
if ($th->fetch()->[0] != $exid) {
        ...
Run Code Online (Sandbox Code Playgroud)

基本上,这会尝试查看是否返回了ID,如果不是,则继续执行脚本.但是它会在这个$th->fetch()->[0]东西上抛出Null数组引用错误.我怎么才能只是检查它是否返回行或现在?

mysql perl dbi

19
推荐指数
3
解决办法
6万
查看次数

如果零行受到影响,为什么DBI的do方法返回"0E0"?

我在运行类似于以下示例的代码时遇到了问题:

my $rows = $dbh->do('UPDATE table SET deleted=NOW() WHERE id=?', undef, $id) 
  or die $dbh->errstr;
if (!$rows) {
  # do something else
}
Run Code Online (Sandbox Code Playgroud)

由于文档声明do返回受影响的行数,我认为这样可行.

准备并执行单个陈述.返回受影响或undef出错的行数.返回值-1表示行数未知,不适用或不可用.

事实证明,我错了.当我调试它时,我看到它$rows实际上保存了字符串0E0,当然这是一个真正的值.我进一步挖掘了文档并看到了这段代码:

默认的do方法在逻辑上类似于:

  sub do {
      my($dbh, $statement, $attr, @bind_values) = @_;
      my $sth = $dbh->prepare($statement, $attr) or return undef;
      $sth->execute(@bind_values) or return undef;
      my $rows = $sth->rows;
      ($rows == 0) ? "0E0" : $rows; # always return true if no error
  }
Run Code Online (Sandbox Code Playgroud)

它就是.它回来了 …

perl dbi

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

如何使用Perl的DBI处理unicode?

我的美味到wp perl脚本可以工作但是给所有"怪异"字符甚至更奇怪的输出.所以我试过了

$description = decode_utf8( $description ); 
Run Code Online (Sandbox Code Playgroud)

但这并没有什么不同.我希望例如"go live"成为"go live"而不是"live live"我如何在Perl中处理unicode以便这样做?

更新:我发现问题是设置我必须在Perl中设置的DBI:

my $sql = qq{SET NAMES 'utf8';};
$dbh->do($sql);
Run Code Online (Sandbox Code Playgroud)

那是我必须设置的部分,很棘手.谢谢!

unicode perl dbi

18
推荐指数
4
解决办法
2万
查看次数

如何使用DBI从数据库中获取单个计数值?

对于获得单个计数值,以下代码似乎太多了.是否有更好的,推荐的方法来使用纯DBI获取单个COUNT值?

sub get_count {
   my $sth = $dbh->prepare("SELECT COUNT(*) FROM table WHERE...");
   $sth->execute( @params );
   my $($count) = $sth->fetchrow_array;
   $sth->finish;

   return $count;
}
Run Code Online (Sandbox Code Playgroud)

这个更短,但我还有两个陈述.

sub get_count_2 {
   my $ar = $dbh->selectall_arrayref("SELECT ...", undef, @params)
   return $ar->[0][0];
}
Run Code Online (Sandbox Code Playgroud)

database perl dbi

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

如何在Perl的DBI填充占位符后打印执行的SQL查询?

我正在使用Perl的DBI模块.我使用占位符准备一个语句,然后执行查询.

是否可以打印出执行的最终查询而无需手动转义参数并将其放入占位符?

谢谢

mysql sql perl prepared-statement dbi

17
推荐指数
4
解决办法
2万
查看次数

我应该使用哪个Perl数据库接口?

CPAN DBI最好的数据库接口Perl中使用通用数据库的使用?有更好的选择吗?

perl cpan dbi

16
推荐指数
3
解决办法
2125
查看次数

如何在Perl中使用DBI获取列名和行数据?

我正在使用DBI来查询SQLite3数据库.我有什么工作,但它没有按顺序返回列.例:

Query:  select col1, col2, col3, col4 from some_view;
Output:

    col3, col2, col1, col4
    3, 2, 1, 4
    3, 2, 1, 4
    3, 2, 1, 4
    3, 2, 1, 4
    ...

(values and columns are just for illustration)
Run Code Online (Sandbox Code Playgroud)

我知道这种情况正在发生,因为我正在使用哈希,但如果我只使用数组,我还能如何获得列名?我想做的就是为任意查询得到这样的东西:

    col1, col2, col3, col4
    1, 2, 3, 4
    1, 2, 3, 4
    1, 2, 3, 4
    1, 2, 3, 4
    ...
Run Code Online (Sandbox Code Playgroud)

(也就是说,我需要输出的顺序和列名都是正确的.)

我非常喜欢Perl新手,但我真的认为这是一个简单的问题.(我以前在Ruby和PHP中做过这个,但是我在Perl文档中追踪我正在寻找的内容时遇到了麻烦.)

这是我目前所拥有的简化版本:

use Data::Dumper;
use DBI;

my $database_path = '~/path/to/db.sqlite3';

$database = DBI->connect(
  "dbi:SQLite:dbname=$database_path",
  "",
  "", …
Run Code Online (Sandbox Code Playgroud)

sqlite perl dbi

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

Perl DBI使用mysql本机多插入功能插入多行

有没有人见过Perl的DBI类型模块,可以很容易地利用MySQL的多插入语法

insert into TBL (col1, col2, col3) values (1,2,3),(4,5,6),...

我还没有找到允许我这样做的界面.我发现的唯一一件事是遍历我的数组.这种方法似乎不太理想,而不是把所有东西都扔到一行并让MySQL处理它.我没有找到任何 IE google的文档,这些文件揭示了我自己编写代码的缺点.

TIA

mysql perl insert dbi

12
推荐指数
2
解决办法
8835
查看次数

标签 统计

dbi ×10

perl ×10

mysql ×4

cpan ×1

database ×1

insert ×1

prepared-statement ×1

sql ×1

sqlite ×1

unicode ×1