2017-12-10 23 views
0

私はgolangの学習を始めていますが、私のエラーが概念的であるか言語であるかはわかりません。golangでSQLiteデータベースを開くことができません: "データベースファイルを開けませんでした" - エラー

私のコードをユニットテストするときにエラーが発生するだけなので、それは特有です。もし私が "走ったら"すべてがうまくいく。 sqliteドライバとして私はmattn/go-sqlite3を使用します。問題が発生したのはここ

は次のとおりです。

func dbExec(command *string) { 
    db, err := sql.Open("sqlite3", dbPath) // Path and driver are set correcrtly 
    defer db.Close() 
    if err != nil { //No problem here 
     panic(err) 
    } 
    _, err = db.Exec(*command) 
    if err != nil { //Here the errorNo14 "Unable to open the database file" occurs 
     panic(err) 
    } 
} 

だから、データベースファイルを見つけることができることを、私には思えるが、それはので、他の制限を開くことはできません。私はすべてのコードで並行処理をしていません。これまでのテスト方法は1つしかなかったので、テストが並行して実行されても、今のところ1つのスレッドにしかなりません。多分誰かがアイデアを持っています!問題は基本的なように思えますが、実際には私のコードにそれほど多くはありません。

答えて

0

sql.Openは通常、データベース操作を実行せず、ドライバを初期化するだけです(詳細はsql.Open docsを参照)。ドライバーのOpen()メソッドがバックグラウンドで呼び出されます。

これは、通常、操作を実行しようとすると、最初のエラーが発生することを意味します(db.Exec)。

実際のエラーについて:これがテスト中であれば、パスが正しくない可能性があります(例:テストデータベースがテストのサブディレクトリにある場合、テストランナーの現在のディレクトリは異なります)。絶対パス(または実行時に計算されたパス)に切り替えてみてください。

最初のエラーチェックの後、小さな番号:defer db.Close()を移動します。

+0

ありがとうございましたMarc!あなたのアイデアはまさに正しいものでした。私の道は相対的だった。ユニットテストを実行しているとき、main.goを実行しているときはパスは偽でした。もしあなたがそれを知っていれば、超簡単。 – achnichtsowichtig

関連する問題