MySQLを使用している場合、自動更新の日時列は1つしかないと思います。そのため、代わりにSQLAlchemyのイベントトリガーを使用します。
'before_insert'フックと'before_update'フックにリスナーをアタッチし、必要に応じて更新します。
from sqlalchemy import event
@event.listen(YourModel, 'before_insert')
def update_created_modified_on_create_listener(mapper, connection, target):
""" Event listener that runs before a record is updated, and sets the create/modified field accordingly."""
target.created = datetime.utcnow()
target.modified = datetime.utcnow()
@event.listen(YourModel, 'before_update')
def update_modified_on_update_listener(mapper, connection, target):
""" Event listener that runs before a record is updated, and sets the modified field accordingly."""
# it's okay if this field doesn't exist - SQLAlchemy will silently ignore it.
target.modified = datetime.utcnow()
これを新しいモデルに追加することを誰も覚えていないことを私は知っていたので、私は賢くそれらのためにそれを追加しようとしました。
すべてのモデルは、巧妙に「DatabaseModel」と呼ばれるベースオブジェクトから継承しています。このオブジェクトから誰が継承するかを確認し、それらすべてにトリガーを動的に追加します。
モデルに作成または変更されたフィールドがなくても問題ありません-SQLAlchemyはそれを黙って無視しているように見えます。
class DatabaseModel(db.Model):
__abstract__ = True
#...other stuff...
@classmethod
def _all_subclasses(cls):
""" Get all subclasses of cls, descending. So, if A is a subclass of B is a subclass of cls, this
will include A and B.
(Does not include cls) """
children = cls.__subclasses__()
result = []
while children:
next = children.pop()
subclasses = next.__subclasses__()
result.append(next)
for subclass in subclasses:
children.append(subclass)
return result
def update_created_modified_on_create_listener(mapper, connection, target):
""" Event listener that runs before a record is updated, and sets the create/modified field accordingly."""
# it's okay if one of these fields doesn't exist - SQLAlchemy will silently ignore it.
target.created = datetime.utcnow()
target.modified = datetime.utcnow()
def update_modified_on_update_listener(mapper, connection, target):
""" Event listener that runs before a record is updated, and sets the modified field accordingly."""
# it's okay if this field doesn't exist - SQLAlchemy will silently ignore it.
target.modified = datetime.utcnow()
for cls in DatabaseModel._all_subclasses():
event.listen(cls, 'before_insert', update_created_modified_on_create_listener)
event.listen(cls, 'before_update', update_modified_on_update_listener)