Избегайте добавления объекта зефира 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
метод