2014-01-27 52 views
1

我是Databse的新手。我在我的系統上安裝了SQLite和嘗試運行Perl程序插入到DATABSE使用DBD :: 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。我猜這個版本沒有問題

+0

如果這是原因,那麼它會打印錯誤消息說「無法連接」。但它沒有給出任何這樣的錯誤。糾正我,如果我錯了 – Nitesh

+0

好的。如何給數據庫的路徑??。假設我在'c:// sqlite'文件夾中創建了數據庫 – Nitesh

+0

Nit:'b text'比'b string'更有意義 – ikegami

回答

3

one.db可能不是從命令行創建的數據庫的路徑。

如果您要求打開一個不存在的數據庫,它會創建它。就像命令行工具一樣。

例如,如果路徑到你的數據庫是c:\sqlite\one.db,你可以使用

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

或可能

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

我試過了,但它給了另一條消息說DBI連接('dbname = C:/Users/nitkumar/Downloads/sqllite/one.db','',...)失敗: 數據庫磁盤映像在DBI格式不正確。 txt行8 無法連接在DBI.txt第8行。 – Nitesh

+0

Nitesh:是否刪除並重新創建表幫助? – ysth

+2

這是一個完全獨立的問題/問題。二進制文件的ASCII傳輸損壞?版本不兼容?什麼是'$ dbh - > {sqlite_version}'和你的客戶使用的SQLite版本? – ikegami

3

我希望你創建的one.db是不一樣的one.db你的Perl腳本正試圖訪問。確保您創建的one.db與您運行的Perl腳本的目錄位於

DBD :: SQLite的將創建數據庫文件,如果它不存在,那麼,什麼是有可能發生的事情是,你在一個目錄中創建one.db,然後從另一個目錄執行你的Perl腳本,在該目錄中創建第二one.db

我通常做我的Perl腳本在我的SQLite表的作品,以便有沒有猜測,我可以很容易地吹我的數據庫文件走在以後,一切都將只是自動的工作:

$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}); 

然後,你可以停止做所有這些or die ...檢查。

相關問題