使用Perl插入PostgreSQL表

时间:2013-04-12 00:40:20

标签: perl postgresql

我正在尝试自动填充PostgreSQL数据库中的表。不幸的是,我没有让insert语句起作用。

第一行是ID,它是一个整数,第二列是数字数据类型。我正在使用Perl脚本来实现这一目标。

我正在使用rand函数创建0到1之间的随机数。第一个参数是变量$id;第二个参数是变量$count

根据计数,该表将填充ID后跟一个随机数。

我正在使用PostgreSQL 9.2.4。

-ID | Random_Number
-1 |  0.01
-1 |  0.03
-2 |  0.0566

#!/usr/bin/perl

use DBI;

my $id = <>;
my $count = <>;

my $db_host = 'localhost';
my $db_user = 'postgres';
my $db_pass = '12345';
my $db_name = 'postgres';

my $db = "dbi:Pg:dbname=${db_name};host=${db_host}";

$dbh = DBI->connect($db, $db_user, $db_pass, { RaiseError => 1, AutoCommit => 0 })
        || die "Error connecting to the database: $DBI::errstr\n";

for (my $loop = 0; $loop < $count; $loop++) {
    my $random_number = rand();
    my $loop++;
    my $query = "insert into random_table values($loop,$random_number)";
}

2 个答案:

答案 0 :(得分:2)

这是不必要的复杂。只是:

CREATE TABLE random_table(id integer, random_value float);

然后:

my $dbh = DBI->connect($db, $db_user, $db_pass,{ RaiseError => 1, AutoCommit => 0 })
my $sth $dbh->prepare("INSERT INTO random_table(id,random_value) SELECT x, random() FROM generate_series(?,?);")
my $result = $sth->execute(0, $count);

(未经测试,但我很确定这是正确的。)

顺便说一句,你真的需要:

use strict;
use warnings;
use 5.10.1; // or whatever the oldest Perl you support is
在你的脚本中

答案 1 :(得分:1)

首先,您将重新声明$ loop变量,该变量将掩盖其先前的声明。由于未定义值上的++ = 1,$ query中的$ loop每次都是1。

for(my $loop=0; $loop < $count;$loop++)
{
  my $random_number = rand();
  my $loop++; # Shouldn't be here
  my $query = "insert into random_table values($loop,$random_number)";
}

如果你在perl上发出警告就会警告你这件事。

其次,你对$ query一无所知。这只是一个字符串。你必须执行它,例如$ dbh-&GT; DO($查询)