Upload 4 files
Browse files
main.py
CHANGED
|
@@ -35,26 +35,46 @@ async def require_api_key(x_api_key: str | None = Header(default=None)):
|
|
| 35 |
# DB
|
| 36 |
# --------------------------
|
| 37 |
import pathlib
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
else:
|
| 48 |
-
#
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
|
|
|
| 58 |
engine = create_engine(
|
| 59 |
DB_URL,
|
| 60 |
echo=False,
|
|
|
|
| 35 |
# DB
|
| 36 |
# --------------------------
|
| 37 |
import pathlib
|
| 38 |
+
import os
|
| 39 |
+
from sqlmodel import create_engine
|
| 40 |
+
|
| 41 |
+
def _ensure_dir(path: str) -> bool:
|
| 42 |
+
try:
|
| 43 |
+
pathlib.Path(path).mkdir(parents=True, exist_ok=True)
|
| 44 |
+
return True
|
| 45 |
+
except Exception:
|
| 46 |
+
return False
|
| 47 |
+
|
| 48 |
+
def _make_sqlite_url(db_path: str) -> str:
|
| 49 |
+
# 引数は絶対パスを想定
|
| 50 |
+
return f"sqlite:///{db_path}"
|
| 51 |
+
|
| 52 |
+
# 1) 環境変数があれば最優先
|
| 53 |
+
DB_URL = os.getenv("DATABASE_URL")
|
| 54 |
+
|
| 55 |
+
if DB_URL and DB_URL.startswith("sqlite"):
|
| 56 |
+
# sqlite:///... または sqlite:////...
|
| 57 |
+
raw = DB_URL.replace("sqlite:///", "", 1)
|
| 58 |
+
# absolute/relative を正規化
|
| 59 |
+
raw = raw if raw.startswith("/") else os.path.abspath(raw)
|
| 60 |
+
dir_ = os.path.dirname(raw)
|
| 61 |
+
if not _ensure_dir(dir_):
|
| 62 |
+
# 失敗時は /tmp にフォールバック
|
| 63 |
+
fallback = "/tmp/app.db"
|
| 64 |
+
_ensure_dir(os.path.dirname(fallback))
|
| 65 |
+
DB_URL = _make_sqlite_url(fallback)
|
| 66 |
else:
|
| 67 |
+
# 2) /data → 3) /tmp → 4) ./ の順でフォールバック
|
| 68 |
+
candidates = ["/data/app.db", "/tmp/app.db", os.path.abspath("./app.db")]
|
| 69 |
+
chosen = None
|
| 70 |
+
for p in candidates:
|
| 71 |
+
if _ensure_dir(os.path.dirname(p)):
|
| 72 |
+
chosen = p
|
| 73 |
+
break
|
| 74 |
+
assert chosen is not None, "No writable location found for SQLite DB"
|
| 75 |
+
DB_URL = _make_sqlite_url(chosen)
|
| 76 |
+
|
| 77 |
+
# 3) SQLite のスレッド設定
|
| 78 |
engine = create_engine(
|
| 79 |
DB_URL,
|
| 80 |
echo=False,
|