6

有没有办法避免在使用 Marshmallow 时将数据插入会话 - 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')>

为避免此问题的解决方法,在我尝试加载后,我可以调用 DBSession.close()来忽略临时数据。但是我再次需要让会话将数据刷新到 DB 中。

请指教。谢谢你的帮助

4

2 回答 2

-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 回答
-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's 方法将对象添加到会话中

于 2016-04-24T10:36:23.893 回答