6

マシュマロを使用しているときにデータをセッションに挿入しないようにする方法はありますか - sqlalchemy

sqlalchemy marshmallow はセッションへのロードを回避します

参照: https://marshmallow-sqlalchemy.readthedocs.org/en/latest/

オブジェクトを自分で管理しようとしたためです。必要に応じてセッションに追加しますが、検証のために使用する必要がありますload()

author = Author(name='Chuck Paluhniuk')
book = Book(title='Fight Club', author=author)
session.add(author)
session.add(book)
session.commit()

author_schema.dump(author).data
# {'books': [123], 'id': 321, 'name': 'Chuck Paluhniuk'}

author_schema.load(dump_data, session=session).data
# <Author(name='Chuck Paluhniuk')>

この問題を回避するための回避策は、負荷を試した後、DB を呼び出しSession.close()て一時データを無視することです。しかし、ここでもセッションを取得してデータを DB にフラッシュする必要があります。

ご意見をお聞かせください。ご協力いただきありがとうございます

4

2 に答える 2

-1

オブジェクトを に追加しても、コードに悪影響sessionはありません。おっしゃる通り、後は自分でやってください。したがって、手動で追加するか、方法で追加するかに違いはありません。load

author = author_schema.load(dump_data, session=session)
# now author has been added to session by load method
# do whatever you want
db.session.commit() # This is enough to write changes you've made
# or if you don't want to save anything just
db.session.rollback()

loadのメソッドによるセッションへのオブジェクトの追加を禁止したい理由が本当にわかりませんでした

于 2016-04-24T10:36:23.893 に答える
-1

スキーマの呼び出しはload()、オブジェクトをセッションに自動的に追加しません。

>>> from models import session
>>> from schema import author_schema
>>> a = {'id': 1, 'name': 'Chuck Paluhniuk'}
>>> obj = author_schema.load(a, session=session)
>>> session.new
IdentitySet([])
>>> session.add(obj.data)
>>> session.new
IdentitySet([<Author(name=u'Chuck Paluhniuk')>])
>>> session.commit()
>>> session.new
IdentitySet([])
>>> session.identity_map.items()
[((<class 'models.Author'>, (1,)), <Author(name=u'Chuck Paluhniuk')>)]
>>> session.dirty
IdentitySet([])

オブジェクトは、別の方法でセッションに参加している必要があります。おそらく、問題を示すコードの一部を投稿できますか?

更新session.dirty: の出力をサンプル コードに追加しました。ご覧の通り空っぽです。私は反対票を理解していません。主張はload()セッションを変更することですが、そうではありません。他のいくつかのコードはそうします。シナリオを示すコードの例を提供できますか?

于 2016-04-24T09:40:44.190 に答える