やりたいこと
- 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
> ```python
# 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")
...
コードを修正したところ、正しく動くようになりましたとさ、めでたしめでたし。