相关文章推荐
1
1

More than 3 years have passed since last update.

SQLAlchemy+SQLite3でOperationalError

Last updated at Posted at 2020-04-11
やりたいこと
  • SQLAlchemyでSQLite3を使いたい
  • DBファイルを絶対パスで指定したい
  • Python3.8.1 on alpine linux 3.11 on Docker

    おこったこと

    /var/data にDBファイルが作成されることを期待し、以下のコードを書いた

    engine = create_engine("sqlite:///var/data/project.sqlite3")
    

    実行したところdatabase fileが開けないと怒られた

    sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file

    /var/data はホストOS側のディレクトリをコンテナへマウントしているが、ホストOS側の操作で作成した testfile も正しく見えている

    # ls -la /var/data/
    total 16
    drwxrwxr-x    2 1006     1006          4096 Apr 11 00:41 .
    drwxr-xr-x    1 root     root          4096 Apr 11 00:41 ..
    -rw-r--r--    1 root     root             0 Apr 11 00:41 testfile
    

    パスの指定方法を疑い、公式ドキュメントを確認してみた。

    SQLite — SQLAlchemy 1.3 Documentation

    This means that the actual filename to be used starts with the characters to the right of the third slash.

    # relative path
    e = create_engine('sqlite:///path/to/database.db')
    

    相対パスはスラッシュ3つな。

    An absolute path, which is denoted by starting with a slash, means you need four slashes

    # absolute path
    e = create_engine('sqlite:////path/to/database.db')
    

    絶対パス使いたいならスラッシュは4つな。

    orz...

    やりたかったことは /var/data/project.sqlite3 への絶対パス指定なので、

    sqlite:///var/data/project.sqlite3

    ではなく、下記のように指定する必要があった

    sqlite:////var/data/project.sqlite3

    engine = create_engine("sqlite:////var/data/project.sqlite3")
    

    コードを修正したところ、正しく動くようになりましたとさ、めでたしめでたし。

    Register as a new user and use Qiita more conveniently

    1. You get articles that match your needs
    2. You can efficiently read back useful information
    What you can do with signing up
    Sign up Login
    1
     
    推荐文章