7

SQLAlchemy の監査 mixin に取り組んでいますが、これを行う方法が正確にはわかりません。

私のクラスは次のようになります。

class AuditColumns(object):

    created_dt = Column(DateTime,
                        default=datetime.utcnow(),
                        nullable=False)

    created_by = Column(String(64),
                        default=current_user,
                        nullable=False)

    updated_dt = Column(DateTime,
                        default=datetime.utcnow(),
                        nullable=False,
                        onupdate=datetime.utcnow())
    updated_by = Column(String(64),
                        default=current_user,
                        nullable=False,
                        onupdate=current_user)

テーブルレベルで最新の更新を記録するだけでよいので、更新されたものは問題ありません。重要な監査は、更新/削除などを詳述する別の表で行われます。

私の問題は; created_dt/by 列を更新したくありません。私のコードでは、オブジェクトを更新するときにそれらを単純に省略できます。しかし、別のコーダーはそうかもしれません。したがって、すべての更新の前に値をそれ自体でオーバーライドするか、誰かが値を変更しようとするとエラーが発生することを確認したいです (後者が推奨されます)。

私の SQLAlchemy スキルはまだ発展途上です。または、save() や before_save() などの一般的な宣言関数をオーバーライドすることでできることはありますか?

私は答えを探し続けます-しかし、解決策を見つけるのを手伝ってください(コードを与えられたくないでしょう)。

4

2 に答える 2

8

あなたの問題は、「デフォルト」と「onupdate」に呼び出し可能オブジェクトを使用していないことです。ここに文書化されています

日付の場合 (括弧がないことに注意してください):

default=datetime.datetime.utcnow
onupdate=datetime.datetime.utcnow

またはユーザー名の場合:

default=lambda: current_user.username

後者の例は、current_user に対してさまざまな安全性チェックを行うために、ラムダではなく関数にする必要があります (たとえば、匿名の場合はどうなりますか?)

于 2013-11-07T15:43:14.717 に答える