From b8286127a9c8aa864f3e4deaa07b52e6ee1cfa17 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 Dec 2023 06:42:10 -0600 Subject: [PATCH 1/3] add_to_dict(): Move to callback function unihan-db-tpeMWywt-py3.12/lib/python3.12/site-packages/sqlalchemy/event/registry.py:291: in listen dispatch_collection = getattr(target.dispatch, identifier) E AttributeError: 'registry' object has no attribute 'dispatch' See also: https://docs.sqlalchemy.org/en/20/orm/events.html#sqlalchemy.orm.MapperEvents.after_configured !squash --- src/unihan_db/bootstrap.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/unihan_db/bootstrap.py b/src/unihan_db/bootstrap.py index 201b9ffe..62908e55 100644 --- a/src/unihan_db/bootstrap.py +++ b/src/unihan_db/bootstrap.py @@ -6,7 +6,7 @@ import sqlalchemy from sqlalchemy import create_engine, event -from sqlalchemy.orm import Session, class_mapper, scoped_session, sessionmaker +from sqlalchemy.orm import Mapper, Session, class_mapper, scoped_session, sessionmaker from sqlalchemy.orm.decl_api import registry from sqlalchemy.orm.scoping import ScopedSession @@ -198,6 +198,12 @@ def bootstrap_unihan( log.info("Done adding rows.") +@event.listens_for(Unhn, "before_mapper_configured", once=True) +def setup_orm_mappings(mapper: Mapper[Base], class_: Base) -> None: + """Add special methods to Base declarative model used in Unihan DB.""" + add_to_dict(class_) # Add .to_dict() to rows returned + + def to_dict(obj: t.Any, found: t.Optional[t.Set[t.Any]] = None) -> t.Dict[str, object]: """Return dictionary of an SQLAlchemy Query result. @@ -272,7 +278,6 @@ def get_session( engine_url = engine_url.format(**{"user_data_dir": dirs.user_data_dir}) engine = create_engine(engine_url) - event.listen(mapper_reg, "after_configured", add_to_dict(Base)) Base.metadata.create_all(bind=engine) session_factory = sessionmaker(bind=engine) session = scoped_session(session_factory) From 93d025736a221f7293150c6f5bb6dac87fc9935d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 Dec 2023 08:40:41 -0600 Subject: [PATCH 2/3] examples(01_bootstrap): Test to_dict() --- examples/01_bootstrap.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/01_bootstrap.py b/examples/01_bootstrap.py index 9085a2a1..7f44f224 100755 --- a/examples/01_bootstrap.py +++ b/examples/01_bootstrap.py @@ -17,3 +17,5 @@ random_row = random_row_query.first() pprint.pprint(bootstrap.to_dict(random_row)) + +pprint.pprint(random_row.to_dict()) # type:ignore From 1a5232913365a17f3377943559ca463eb41f571b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 Dec 2023 07:44:56 -0600 Subject: [PATCH 3/3] docs(CHANGES): Note event dispatch bug --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 9aaaeaf9..a645d587 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,9 @@ $ pip install --user --upgrade --pre unihan-db ### Bug fixes +- SQLAlchemy: Fix `add_to_dict()` event mapper bug (#325) + + This allows `Unhn` rows to use `row.as_dict()` once more. - Bump unihan-etl 0.30.0post0 -> 0.30.1 Fix `kRSUnicode` double apostrophes.