LoginSignup
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")
...

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

1
1
0

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
  3. You can use dark theme
What you can do with signing up
1
1