如何获取使用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'}.
正如我在这里看到的,从 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. 但这也行不通。可能还有额外的代码,但如果可能的话我会避免更改标准库。 …
我试图基本上用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数组引用错误.我怎么才能只是检查它是否返回行或现在?
我在运行类似于以下示例的代码时遇到了问题:
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方法在逻辑上类似于:
Run Code Online (Sandbox Code Playgroud)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 }
它就是.它回来了 …
我的美味到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)
那是我必须设置的部分,很棘手.谢谢!
对于获得单个计数值,以下代码似乎太多了.是否有更好的,推荐的方法来使用纯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) 我正在使用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) 有没有人见过Perl的DBI类型模块,可以很容易地利用MySQL的多插入语法
insert into TBL (col1, col2, col3) values (1,2,3),(4,5,6),...?
我还没有找到允许我这样做的界面.我发现的唯一一件事是遍历我的数组.这种方法似乎不太理想,而不是把所有东西都扔到一行并让MySQL处理它.我没有找到任何 IE google的文档,这些文件揭示了我自己编写代码的缺点.
TIA