尝试使用DBD :: SQLite模块插入PERL中的数据库时出现问题

时间:2014-01-27 13:59:49

标签: perl

我是Databse的新手。我在我的系统上安装了SQLite,并尝试运行PERL程序以插入数据库

用于创建数据库和表的SQLite命令

在命令提示符下,我迭代到SQlite目录并给出命令

sqlite3 one.db;
create table table1 (a int, b string);

它创建了一个数据库和表

我执行了后面的PERL程序

use strict;

use warnings;
use DBI;

use DBD::SQLite;

my $dbh = DBI->connect("dbi:SQLite:dbname=one.db","","") or die "cannot 

connect";

my $sth = $dbh->prepare("INSERT INTO 'table1'
                       (Income, LAST_NAME )
                        values
                       ('1000', 'poul')");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

我收到以下错误

DBD::SQLite::st execute failed: no such table: table1 at DBI.txt line 14.
no such table: table1 at DBI.txt line 14.

收到IKEGAMI的评论后,我将DBI->connect更改为

my $dbh = DBI->connect

("dbi:SQLite:dbname=C:/Users/nitkumar/Downloads/sqllite/one.db","","

") or die "cannot connect";

我开始收到错误消息

DBI connect('dbname=C:/Users/nitkumar/Downloads/sqllite/one.db','',...) failed:
 database disk image is malformed at DBI.txt line 8
cannot connect at DBI.txt line 8.

获得更多评论后,我使用

获得了该版本
use DBD::SQLite;
warn $DBD::SQLite::VERSION;
warn $DBD::SQLite::sqlite_version;

我得到了output

1.37 at version.txt line 2.
3.7.12.1 at version.txt line 3.

我正在使用sqlite3。我想版本

没有问题

2 个答案:

答案 0 :(得分:3)

one.db可能不是您从命令行创建的数据库的路径。

如果您要求打开一个不存在的数据库,它会创建它。就像命令行工具一样。

例如,如果数据库的路径为c:\sqlite\one.db,则可以使用

"dbi:SQLite:dbname=c:\\sqlite\\one.db"

或者可能

"dbi:SQLite:dbname=c:/sqlite/one.db"

答案 1 :(得分:3)

我希望您创建的one.db与您的Perl脚本尝试访问的one.db不同。确保您创建的one.db与中运行Perl脚本的目录位于同一目录。

DBD :: SQLite将创建数据库文件(如果它不存在),因此可能发生的是您在一个目录中创建one.db,然后从另一个目录执行Perl脚本,创建第二个{ {1}}在该目录中。

我通常在我的Perl脚本中进行SQLite表创建,这样就没有猜测,我可以在以后轻松地将我的db文件吹掉,一切都会自动完成:

one.db

此外,如果为db文件指定绝对路径,您会发现事情会更好。您可以相对于$dbh->do(q[ CREATE TABLE IF NOT EXISTS table1 ( a int, b string ) ]); 目录或脚本的目录创建它。我会推荐后者:

$ENV{HOME}

最后,使用use FindBin qw( $Bin ); my $dbh = DBI->connect("dbi:SQLite:dbname=$Bin/one.db","","") !编写样板以检查是否存在错误是浪费您的时间,而您总是会忘记某些事情。所以,这样做:

RaiseError

然后你可以停止进行所有my $dbh = DBI->connect("dbi:SQLite:dbname=$Bin/one.db","","", {RaiseError => 1}); 次检查。