-2

我在使用 dbi sqlite3 使用 Perl 创建的数据库中创建表时遇到问题。使用下面的代码,我希望该表包含端口探测器,每个源 ip 和端口一行。我不知道我是否做得正确,下面的代码由于某种原因不起作用,任何帮助将不胜感激。我的代码如下。

#!/usr/bin/perl

use strict;
use DBI;

my $dbh = DBI->connect(          
    "dbi:SQLite:dbname=test.db", 
    "",
    "",
    { RaiseError => 1}
) or die $DBI::errstr;


$dbh->do(CREATE TABLE probes (
  source CHAR(15) NOT NULL,
  port CHAR(5) NOT NULL,
  PRIMARY KEY (source,port)) );


$dbh->disconnect();
4

2 回答 2

2

您忘记将论点引用到$dbh->do. 有很多方法可以做到这一点。

$dbh->do( "CREATE TABLE probes ( ..." );
$dbh->do( 'CREATE TABLE probes ( ...' );
$dbh->do( qq[ CREATE TABLE probes ( ... ] );
$dbh->do( <<"END_SQL" );
CREATE TABLE probes (
   ...
END_SQL

补充:要解决此问题,您只需在$dbh->do函数调用中的内容周围加上引号。

$dbh->do("CREATE TABLE probes (
  source CHAR(15) NOT NULL,
  port CHAR(5) NOT NULL,
  PRIMARY KEY (source,port))");
于 2013-04-05T02:07:31.753 回答
0

您还应该use warnings在每个程序的顶部都有。

您需要为该do方法提供一个 SQL 字符串。通常使用here 文档来编写多行字符串,如下所示。

$dbh->do(<<'END_SQL');
CREATE TABLE probes (
    source CHAR(15) NOT NULL,
    port CHAR(5) NOT NULL,
    PRIMARY KEY (source, port) )
END_SQL

请注意,该END_SQL行不能在行首或行尾包含任何空格。

于 2013-04-05T01:32:35.133 回答