1- from typing import Generator
1+ from typing import Annotated , Generator
22
3+ from fastapi import Depends
34from loguru import logger
4- from sqlalchemy import inspect , text
5+ from sqlalchemy import inspect , schema , text
56from sqlalchemy .engine import Engine
67from sqlalchemy .pool import StaticPool
78from sqlmodel import Session , SQLModel , create_engine
89
9- from config import settings
10+ from config import Settings , get_settings
1011
1112_engine : Engine | None = None
1213
1314
14- def get_db () -> Generator [Session , None , None ]:
15+ def get_session (
16+ settings : Annotated [Settings , Depends (get_settings )],
17+ ) -> Generator [Session , Settings , None ]:
1518 with Session (_engine ) as session :
19+ session .connection (
20+ execution_options = {"schema_translate_map" : {None : settings .database_schema }}
21+ )
1622 yield session
1723
1824
19- def get_engine (database_url : str | None = None ) -> Engine :
25+ SessionDep = Annotated [Session , Depends (get_session )]
26+
27+
28+ def get_engine (_settings : Settings | None = None ) -> Engine :
2029 """Get or create SQLModel engine instance."""
2130 global _engine
2231
2332 if _engine is not None :
2433 return _engine
2534
26- if database_url is None :
27- database_url = settings .database_url
35+ if _settings is None :
36+ _settings = get_settings ()
37+
38+ database_url = _settings .database_url
2839
2940 # Configure engine based on database type
3041 engine_args = {"echo" : True }
@@ -38,29 +49,38 @@ def get_engine(database_url: str | None = None) -> Engine:
3849 _engine = create_engine (database_url , ** engine_args )
3950
4051 # Enable WAL mode if configured
41- if settings .sqlite_wal_mode :
52+ if _settings .sqlite_wal_mode :
4253 with _engine .connect () as conn :
4354 # https://www.sqlite.org/pragma.html
4455 conn .execute (text ("PRAGMA journal_mode=WAL" ))
4556 # conn.execute(text("PRAGMA synchronous=OFF"))
4657 logger .info ("SQLite WAL mode enabled" )
4758
4859 # Initialize database if using SQLModel
49- if settings .model_config == "sqlmodel" and not settings .migrate_database :
60+ if (
61+ _settings .database_type == "sqlmodel"
62+ and _settings .database_schema
63+ and not _settings .database_url .startswith ("sqlite" )
64+ ):
65+ SQLModel .metadata .schema = _settings .database_schema
66+ with _engine .connect () as conn :
67+ conn .execution_options = {
68+ "schema_translate_map" : {None : _settings .database_schema }
69+ }
70+ if not conn .dialect .has_schema (conn , _settings .database_schema ):
71+ logger .warning (
72+ f"Schema '{ _settings .database_schema } ' not found in database. Creating..."
73+ )
74+ conn .execute (schema .CreateSchema (_settings .database_schema ))
75+ conn .commit ()
76+
77+ if _settings .database_type == "sqlmodel" and not _settings .migrate_database :
5078 logger .info ("Creating database tables..." )
5179
52- if settings .database_schema :
53- SQLModel .metadata .schema = settings .database_schema
54- # with self.engine.connect() as conn:
55- # if not conn.dialect.has_schema(conn, db_schema):
56- # logger.warning(f"Schema '{db_schema}' not found in database. Creating...")
57- # conn.execute(sa.schema.CreateSchema(db_schema))
58- # conn.commit()
59-
6080 # Check if tables exist before creating them
6181 inspector = inspect (_engine )
6282 existing_tables = inspector .get_table_names (
63- schema = settings .database_schema if settings .database_schema else None
83+ schema = _settings .database_schema if _settings .database_schema else None
6484 )
6585 if not existing_tables :
6686 # if settings.database_schema:
0 commit comments