【问题标题】:Inserting Data From Perl To MysQL从 Perl 插入数据到 MySQL
【发布时间】:2019-12-19 14:14:46
【问题描述】:

我已经将 MySQL 连接到数据库,但问题是 我在将数据从 Perl 插入 Mysql 时遇到了一些问题。

弹出的错误是:

Use of uninitialized value in concatenation (.) or string at ./etl_server_info.pl line 204, (Which is the connection of the database ) 

DBD::mysql::st execute failed: called with 1 bind variables when 0 are needed at ($stmt->execute($sql);) 
sub insert_record(){

 my($data,$db_config)=@_;
 my $result = -1; # -1 fail;  0 - succ

  # connect to db
  # connect to MySQL database
  my $dsn = "DBI:mysql:database=".$db_config->{'Top_Data'}.";host=".$db_config->{'127.0.0.1'}.";port=".$db_config->{'3306'};
my $username = $db_config->{'username'};
my $password = $db_config->{'password'};

my %attr = (PrintError=>0,RaiseError=>1 );
my $dbh = DBI->connect($dsn,$username,$password,\%attr) or die $DBI::errstr;

print "We Have Successfully Connected To The Database \n";

  # prepare sql statement
  # execute insert
  my $sql = 'insert into Top(Load_Average, CPU_us, CPU_id, CPU-wa, CPU_hi, CPU_si, CPU_st, Swap_Total, Swap_Free, Swap_Used, Memory_Total, Memeory_Free, Memory_Used, Memory_Buff, Date) values(float,float,float,float,float,float,float,float,varchar,varchar,varchar,varchar,varchar,varchar,date)';




  my $stmt =$dbh->prepare($sql) or die "Its A Fail" . $dbh->errstr();
  $stmt->execute($sql);



  $stmt->finish();
  $dbh->disconnect();
  $result = 0;
  return($result);

【问题讨论】:

  • insert into sometable (foo, bar, baz) values ( ?, ?, ?) 然后$stmt->execute( $foo, $bar, $baz)
  • 这对我不起作用:U
  • 阅读perldoc DBI。你的代码是错误的。正如我所说,您必须将确切的值传递给 execute() 并在语句中使用占位符。你将语句传递给execute(),这是错误的

标签: mysql perl


【解决方案1】:

您对$db_config 变量的使用对我来说看起来很可疑。您的配置哈希很奇怪,或者您使用的是值而不是键。

你还没有告诉我们$db_config 的设置位置,但我猜它看起来像这样:

$db_config = {
  name => 'Top_Data',
  host => '127.0.0.1',
  port => 3306,
  username => 'someone',
  password => 'a secret',
};

然后你会像这样使用它:

my $dsn = "DBI:mysql:database=".$db_config->{name}.";host=".$db_config->{host}.";port=".$db_config->{port};

请注意,我使用了键名(namehostport)而不是值(Top_Data127.0.0.13306)。

我还要指出,您可以通过使用 Perl 在双引号字符串中扩展变量的能力来稍微简化这一点。

my $dsn = "DBI:mysql:database=$db_config->{name};host=$db_config->{host};port=$db_config->{port}";

稍后还有另一个问题,与您的 SQL 语句有关。

my $sql = 'insert into Top(Load_Average, CPU_us, CPU_id, CPU-wa, CPU_hi, 
           CPU_si, CPU_st, Swap_Total, Swap_Free, Swap_Used, Memory_Total, 
           Memeory_Free, Memory_Used, Memory_Buff, Date) 
           values(float,float,float,float,float,float,float,float,
           varchar,varchar,varchar,varchar,varchar,varchar,date)';

您应该插入的值是实际的数据项。因此,如果您有字符串“float”、“varchar”或“date”,则实际上应该有数据项(浮点数、字符串或日期)。

最后,准备好声明后,您无需将其传递给execute() 方法。但是,您应该考虑在 SQL 中使用绑定点并将实际数据项传递给 execute() 调用

【讨论】:

  • 但是如果我的数据是一个数组,我怎么能把多个项目放在一个列中......所以我要把值改成这个(?).....因为数据很多而不是单个数据?
  • @DreamMember:您准备一次声明 (my $sth = $dbh->prepare($sql)),用 ? 代替实际值。然后循环遍历数据并为循环的每次迭代调用 $sth->execute(@data) - @data 每次都包含一行数据项。
猜你喜欢
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2022-11-27
  • 2014-11-03
  • 1970-01-01
相关资源
最近更新 更多