2013-09-21 15 views
0

我創建數據庫舞者::教程連接到SQLite的

sqlite3 database 
    create table if not exists entries (
     id integer primary key autoincrement, 
     title string not null, 
     text string not null 
    ); 
    ^D 

我應該在哪裏把這個數據庫? 後

sub connect_db { 
    my $dbh = DBI->connect("dbi:SQLite:dbname=".setting('database')) or 
     die $DBI::errstr; 

    return $dbh; 
    } 

    sub init_db { 
    my $db = connect_db(); 
    my $schema = read_file('./schema.sql'); 
    $db->do($schema) or die $db->errstr; 
    } 

get '/' => sub { 
    my $db = connect_db(); 
    my $sql = 'select id, title, text from entries order by id desc'; 
    my $sth = $db->prepare($sql) or die $db->errstr; 
    $sth->execute or die $sth->errstr; 
    template 'show_entries.tt', { 
     'msg' => get_flash(), 
     'add_entry_url' => uri_for('/add'), 
     'entries' => $sth->fetchall_hashref('id'), 
    }; 
    }; 

收到一個錯誤 運行時錯誤 附近的 「辦公桌」:在/home/ultramozg/App/lib/App.pm 40行語法錯誤,行16

什麼這是我的錯?

+0

'desk'不會出現在您呈現的任何地方。什麼是lib/App.pm的第40行? – ikegami

+0

第40行my $ sth = $ db-> prepare($ sql)或者$ db-> errstr; –

+0

哼哼....這聽起來不像是來自DBI的錯誤,但如果你堅持,'$ sql'中有什麼? – ikegami

回答

0

對於初學者,您有一個^ D字符 - 第一部分的最後一行。請學習閱讀輸出。它會告訴你第16行。

檢查代碼中出現單詞「desk」的位置。

+0

我在終端上創建這個數據庫,^ D = ctrl D –

+0

是否輸入錯誤。使用正確的消息來發現錯誤更容易嗎?它是'桌面'還是'desc' 更容易找到錯誤。 – FaddishWorm

+0

謝謝,數據庫必須在lib目錄下。 –

2

我強烈建議你使用Dancer :: Plugin :: Database,而不是你提出的connect_db例程。你這樣做的方式可能會產生剩餘的開放連接,因此會產生各種各樣的問題。 Dancer :: Plugin :: Database處理持久連接。文件的插件:

https://metacpan.org/pod/Dancer::Plugin::Database

一旦你安裝舞者::插件::數據庫和config.yml配置,那麼每當你需要一個數據庫句柄,你只是:

my $dbh => database('my_database_name'); 

並且在完成時不要打擾斷開連接。

如果你正在使用Ubuntu,只是:

apt-get install libdancer-plugin-database-perl 

祝你的項目!

+0

謝謝你的祝福 –