我正在尝试自动填充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)";
}
答案 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($查询)