ktsn-ud commited on
Commit
067af89
·
1 Parent(s): 5c214c7

DB接続を環境変数からでも行えるように変更

Browse files
Files changed (1) hide show
  1. app/db/session.py +37 -3
app/db/session.py CHANGED
@@ -77,6 +77,35 @@ def _parse_database_url(database_url: str) -> dict:
77
  return {key: val for key, val in connect_kwargs.items() if val not in {None, ""}}
78
 
79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  class MySQLConnectionPool:
81
  """Simple thread-safe connection pool for PyMySQL."""
82
 
@@ -183,10 +212,15 @@ def _ensure_pool() -> MySQLConnectionPool:
183
  return _pool
184
 
185
  database_url = _get_env("DATABASE_URL")
186
- if not database_url:
187
- raise RuntimeError("DATABASE_URL is not set")
 
 
 
 
 
 
188
 
189
- connect_kwargs = _parse_database_url(database_url)
190
  min_size = int(_get_env("DB_POOL_MIN_SIZE", "1"))
191
  max_size = int(_get_env("DB_POOL_MAX_SIZE", "5"))
192
 
 
77
  return {key: val for key, val in connect_kwargs.items() if val not in {None, ""}}
78
 
79
 
80
+ def _build_connect_kwargs_from_env() -> Optional[dict]:
81
+ host = _get_env("DB_HOST")
82
+ database = _get_env("DB_NAME") or _get_env("DB_DATABASE")
83
+ if not host or not database:
84
+ return None
85
+
86
+ connect_kwargs = {
87
+ "host": host,
88
+ "port": int(_get_env("DB_PORT", "3306")), # TODO: DB_PORTのenv追加
89
+ "user": _get_env("DB_USER", ""), # TODO: DB_USERのenv追加
90
+ "password": _get_env("DB_PASSWORD", ""), # TODO: DB_PASSWORDのenv追加
91
+ "database": database,
92
+ "charset": _get_env("DB_CHARSET", "utf8mb4"), # TODO: DB_CHARSETのenv追加
93
+ "autocommit": _str_to_bool(
94
+ _get_env("DB_AUTOCOMMIT", "true")
95
+ ), # TODO: DB_AUTOCOMMITのenv追加
96
+ }
97
+
98
+ connect_timeout = _get_env("DB_CONNECT_TIMEOUT")
99
+ if connect_timeout:
100
+ connect_kwargs["connect_timeout"] = float(connect_timeout)
101
+
102
+ ssl_root_cert = _get_env("SSL_ROOT_CERT")
103
+ if ssl_root_cert:
104
+ connect_kwargs["ssl"] = {"ca": ssl_root_cert}
105
+
106
+ return {key: val for key, val in connect_kwargs.items() if val not in {None, ""}}
107
+
108
+
109
  class MySQLConnectionPool:
110
  """Simple thread-safe connection pool for PyMySQL."""
111
 
 
212
  return _pool
213
 
214
  database_url = _get_env("DATABASE_URL")
215
+ if database_url:
216
+ connect_kwargs = _parse_database_url(database_url)
217
+ else:
218
+ connect_kwargs = _build_connect_kwargs_from_env()
219
+ if connect_kwargs is None:
220
+ raise RuntimeError(
221
+ "DATABASE_URL or DB_HOST and DB_NAME must be set in the environment"
222
+ )
223
 
 
224
  min_size = int(_get_env("DB_POOL_MIN_SIZE", "1"))
225
  max_size = int(_get_env("DB_POOL_MAX_SIZE", "5"))
226