Corin1998 commited on
Commit
350a663
·
verified ·
1 Parent(s): d19e4bb

Upload 4 files

Browse files
Files changed (1) hide show
  1. main.py +39 -19
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
- # 1) DBファイルの場所を /data に(環境変数で上書き可)
40
- DB_URL = os.getenv("DATABASE_URL") # 例: sqlite:////data/app.db
41
- if not DB_URL:
42
- # デフォルトは /data/app.db にしておく
43
- DB_PATH = "/data/app.db"
44
- # パスのディレクトリを作成(存在しなくてもOK)
45
- pathlib.Path(os.path.dirname(DB_PATH)).mkdir(parents=True, exist_ok=True)
46
- DB_URL = f"sqlite:///{DB_PATH}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  else:
48
- # DATABASE_URL sqliteときは、必要ならディレトリを作成
49
- if DB_URL.startswith("sqlite"):
50
- # sqlite:///relative/path または sqlite:////absolute/path の両対応
51
- raw = DB_URL.replace("sqlite:///", "", 1)
52
- # 先頭2スラッシュの正規化('//data/app.db' -> '/data/app.db')
53
- raw = raw[1:] if raw.startswith("/") else raw
54
- dir_ = os.path.dirname("/" + raw) # 先頭に1つ'/'を戻して絶対パス化
55
- pathlib.Path(dir_).mkdir(parents=True, exist_ok=True)
56
-
57
- # 2) SQLite のスレッド設定(FastAPIと相性良く)
 
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,