4

Dog()、Walrus()、Boot()のクラスがあるとしましょう。Walrusオブジェクトは削除できますが、Bootオブジェクトは削除できないので、更新できないようにしたいと思います。したがって、もしそうなら:

dog1 = Dog("DogName")
walrus1 = Walrus("WalrusName")
boot1 = Boot("BootName")
session.add(dog1)
session.add(walrus1)
session.add(boot1)
session.flush()
transaction.commit()
dog1.name = "Fluffy"
walrus1.name = "Josh"
boot1.name = "Pogo"
session.flush()
transaction.commit()

セイウチの名前を変更すると例外がスローされますが、他の名前は変更できます。boot1を削除しようとすると、例外がスローされます。

私はイベントリスナーを数回刺しましたが、どちらの方法でも、私はそこまで到達できません。

#One possibility
#I don't know how to tell that it's just an update though
#The is_modified seems to take inserts as well

@event.listens_for(Session, 'before_flush')
def listener(thissession, flush_context, instances):
    for obj in thissession:
        if isinstance(obj, Walrus):
            if thissession.is_modified(obj, include_collections=False):
                thissession.expunge(obj)


#Possiblity two
#It says before_update but it seems to take in inserts as well
#Also documentation says it's not completely reliable to capture all statements
#where an update will occur
@event.listens_for(Walrus, 'before_update', raw=True)
def pleasework(mapper, connection, target):
    print "\n\nInstance %s being updated\n\n" % target
    object_session(target).expunge(target)

編集1:

@event.listens_for(Walrus, 'before_update', raw=True)
def prevent_walrus_update(mapper, connection, target):
    print "\n\nInstance %s being updated\n\n" % target
    if target not None:
        raise

@event.listens_for(Boot, 'before_delete', raw=True)
def prevent_boot_delete(mapper, connection, target):
    print "\n\nInstance %s being deleted\n\n" % target
    if target not None:
        raise

これは、Walrusを更新したり、Bootを削除したりできない場合に機能しますが、試行のヒントは、キャッチする機能がないように見えるAttributeErrorでクラッシュします。たとえば、Walrus1.name = "Josh"を実行してから、クエリを実行すると、getであっても、AttributeErrorによってアプリケーションがクラッシュします。私は以前よりも進んでいますが、それでもかなり不便です。

4

1 に答える 1

1

あなたが投稿した最初の解決策は、ループを次のように変更するだけで機能するように見えます。

for obj in thissession.dirty:

同じイベントを使用して、before_flushをループすることでBootオブジェクトの削除を防ぐことができますthissession.deleted

于 2013-01-30T09:04:56.703 に答える