すべてのモデル (タイムスタンプ) で単純な機能を共有しようとしており、SQLA ドキュメントで説明されているように、「ベースの拡張」アプローチを使用しています。これまでのところ、私はこれをしました:
import sqlalchemy as sa
from datetime import datetime as dt
class EntityBase(object):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
id = sa.Column(sa.Integer, primary_key=True)
last_update = sa.Column(sa.DateTime, default=dt.utcnow())
def update_entity(mapper, connection, target):
target.last_update = dt.utcnow()
Entity = declarative_base(cls=EntityBase)
sa.event.listen(Entity, 'before_insert', update_entity)
sa.event.listen(Entity, 'before_update', update_entity)
私のモデルはすべてEntity
クラスから派生しています。しかし、実行時に取得しますsqlalchemy.orm.exc.UnmappedClassError: Class 'sqlalchemy.ext.declarative.Base' is not mapped
。私は何を間違っていますか?
更新 次のように単純な前処理を行うことで問題を回避しました。
def setupEntities():
...
for cls in Entity.__subclasses__():
listen(cls, 'before_insert', update_entity)
listen(cls, 'before_update', update_entity)
...
...でも、正しい方法について聞きたいです。