Various bug fixes. Still trying to fix cartesian issue on search.
This commit is contained in:
parent
0dbf246bdb
commit
3c07741500
9 changed files with 412 additions and 94 deletions
|
|
@ -1,7 +1,8 @@
|
|||
# engines.py
|
||||
from __future__ import annotations
|
||||
from typing import Type, Optional
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy import create_engine, event
|
||||
from sqlalchemy.orm import sessionmaker, raiseload, Mapper, RelationshipProperty
|
||||
from .backend import make_backend_info, BackendInfo
|
||||
from .config import Config, get_config
|
||||
from ._sqlite import apply_sqlite_pragmas
|
||||
|
|
@ -12,15 +13,31 @@ def build_engine(config_cls: Type[Config] | None = None):
|
|||
apply_sqlite_pragmas(engine, config_cls.SQLITE_PRAGMAS)
|
||||
return engine
|
||||
|
||||
def _install_nplus1_guards(SessionMaker, *, strict: bool):
|
||||
if not strict:
|
||||
return
|
||||
|
||||
@event.listens_for(SessionMaker, "do_orm_execute")
|
||||
def _add_global_raiseload(execute_state):
|
||||
stmt = execute_state.statement
|
||||
# Only touch ORM statements (have column_descriptions)
|
||||
if getattr(stmt, "column_descriptions", None):
|
||||
execute_state.statement = stmt.options(raiseload("*"))
|
||||
|
||||
def build_sessionmaker(config_cls: Type[Config] | None = None, engine=None):
|
||||
config_cls = config_cls or get_config(None)
|
||||
engine = engine or build_engine(config_cls)
|
||||
return sessionmaker(bind=engine, **config_cls.session_kwargs())
|
||||
SessionMaker = sessionmaker(bind=engine, **config_cls.session_kwargs())
|
||||
|
||||
# Toggle with a config flag; default off so you can turn it on when ready
|
||||
strict = bool(getattr(config_cls, "STRICT_NPLUS1", False))
|
||||
_install_nplus1_guards(SessionMaker, strict=strict)
|
||||
return SessionMaker
|
||||
|
||||
class CRUDKitRuntime:
|
||||
"""
|
||||
Lightweight container so CRUDKit can be given either:
|
||||
- prebuild engine/sessionmaker, or
|
||||
- prebuilt engine/sessionmaker, or
|
||||
- a Config to build them lazily
|
||||
"""
|
||||
def __init__(self, *, engine=None, session_factory=None, config: Optional[Type[Config]] = None):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue