Python 无需与数据库交互即可加载Marshmallow SQLAlchemy

Python 无需与数据库交互即可加载Marshmallow SQLAlchemy,python,serialization,sqlalchemy,marshmallow,Python,Serialization,Sqlalchemy,Marshmallow,使用ModelSchema.load方法时,对象将与数据库交互 例如,当执行以下操作时: author = Author(name="Chuck Paluhniuk") author_schema = AuthorSchema() book = Book(title="Fight Club", author=author) session.add(author) session.add(book) session.commit() dump_data = author_schema.dump(

使用
ModelSchema.load
方法时,对象将与数据库交互

例如,当执行以下操作时:

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

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

load_data = author_schema.load(dump_data, session=session)
上述代码将导致marshmallow sqlalchemy联系数据库。我希望在使用
load
时避免任何和所有数据库交互。我希望自己管理对象,如果愿意,将其添加到会话中,如果不愿意,则将其留在外部

我已经尝试了
transient=True
参数以
load
。例如:

 load_data = author_schema.load(dump_data, session=session, transient=True)

我认为这是假设盲目地实例化对象,而不进行数据库调用,甚至不将对象绑定到会话,但事实并非如此。Marshmallow sqlalchemy即使将此参数设置为true,仍会进行数据库调用。

我对文档(和代码)的阅读同意transient=true不应进行数据库查询。我想你必须提供一些证据证明它在和数据库对话。尝试传入session=object()或其他内容以强制执行异常(如果它实际尝试访问数据库,则应生成stacktrace),但不执行您的建议,我会收到以下错误:
sqlalchemy.orm.exc.FlushError:具有标识键(,(1),无)的新实例尝试加载同一类的第二个示例时与持久实例冲突,这使我认为它正在尝试使用数据库。我也会尽量按照你的建议去做。啊,你可能在处理autoflush,这其实不是棉花糖sqlalchemy的错,就像sqlalchemy的autoflush一样。。您还可以尝试使用session.no_autoflush:
上下文块将整个内容包装在
中,以告诉sqlalchemy使用自动刷新行为进行冷却,即使是刷新,也不应该刷新此对象,因为它永远不应该添加到会话中(如果是暂时的)。至少这是我所期望的。我经历了很多行为,这些行为让我相信炼金术可能是在幕后做了一些事情,在你认为不会的情况下为治疗增加了一些东西。我有很多代码在
no_autoflush
块中,我发誓它不应该在会话中“_(ツ)_/¯