【问题标题】:Inserting into a PostgreSQL table using Perl使用 Perl 插入 PostgreSQL 表
【发布时间】:2013-04-12 13:11:02
【问题描述】:

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

第一行是一个整数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)";
}

【问题讨论】:

  • 为什么?这在简单的 SQL 中完全是微不足道的。这是您打算稍后扩展为真正有用的工具的测试或演示吗?另外:您要问的问题是什么? PostgreSQL 版本? Perl 版本?平台? 任何错误消息的确切文本?近距离投票“不是一个真正的问题”。
  • $loop 已经由您的for 循环管理时,您为什么还要my $loop++;?为什么不使用$dbh-&gt;prepare 和占位符呢?在 INSERT 中指定列是个好主意。
  • 在 SQL 中执行此操作:CREATE TABLE demo(id serial primary key, randnum float); 然后 insert into demo(randnum) select random() from generate_series(1,100); 。 (如果愿意,您可以使用generate_series 来提供 ID,而不是使用序列生成的 ID)。在单个 SQL 查询中执行此操作将比在 Perl 中循环快大大。尽可能避免循环 SQL 调用。
  • @Craig Ringer:我需要根据我提供的参数获取 ID。如果它是重复值,则可以。我正在尝试自动填充表格。尝试测试。
  • @user2272525 然后insert into demo(id, randnum) select x, random() from generate_series($start,$start+$count) x; 并将id 列定义为integer 而不是serial

标签: perl postgresql


【解决方案1】:

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

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

在你的脚本中。

【讨论】:

    【解决方案2】:

    首先,您要重新声明 $loop 变量,这将掩盖其先前的声明。由于 ++ on an undefined value = 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->do($query).

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2012-12-22
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2014-01-24
      相关资源
      最近更新 更多