Избегайте добавления объекта зефира DB Session при использовании объекта зефир sql-alchemy

Есть ли способ избежать вставки данных в сеанс при использовании зефира - sqlalchemy

sqlalchemy зефир избежать загрузки в сессию

Ссылка: 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() игнорировать временные данные. Но опять же мне нужно получить сеанс для сброса данных в БД.

Пожалуйста посоветуй. Спасибо за вашу помощь

2 ответа

Вызов схемы 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() меняет сессию, но это не так. Какой-то другой код делает. Можете ли вы привести пример кода, который показывает ваш сценарий?

Добавление объекта в 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метод

Другие вопросы по тегам