1

我想在 SQLite 上向 table1 添加新记录

use SQL::Abstract;
my %data = (
  id => \'max(id)', # it is doesn't work so which variant is right?
  record => 'Something'
);

my $sql = SQL::Abstract->new;

my ($stmt, @bind) = $sql->insert('table1', \%data);


...
my $sth = $dbh->prepare($stmt);

如果我在 Catalyst 应用程序中使用 DBIx::Class 我会这样写:

id => $c->model('Model')->get_column('id')->max()

它会正常工作。那么我怎样才能达到相同的目标,但只使用 DBIx::Class 中使用的 SQL::Abstract。有人可以修复它吗?谢谢。

4

1 回答 1

2

这是一段代码。如您所见,首先您需要获取最大 id+1,然后执行插入命令。我必须注意到这是不安全的,因为在多(用户、进程、线程)环境中,第二个进程可以执行相同的代码并获得竞争条件。但我假设你只是在学习 SQL::Abstract api,这个问题并不重要

use DBI;
use SQL::Abstract;

#create table TEST(ID integer, NAME varchar);
my $dbh = DBI->connect('dbi:SQLite:dbname=test.db', '', '', {AutoCommit=>1});

my $sql = SQL::Abstract->new;

my($stmt, @bind) = $sql->select("TEST", [ 'max(ID)+1 as ID' ] );
my $sth = $dbh->prepare($stmt);
$sth->execute(@bind);

my ($id) = $sth->fetchrow_array // 1;

print "Select ID: $id", "\n";
$sth->finish;

($stmt, @bind) = $sql->insert("TEST", { ID=>$id, NAME=>"test-name"} );
$sth = $dbh->prepare($stmt);
$sth->execute(@bind);

$dbh->disconnect;
于 2013-04-08T20:12:02.413 回答