Из-за устаревших данных, которые отсутствуют в базе данных, но некоторые внешние файлы, я хочу создать объект SQLAlchemy, который содержит данные, считанные из внешних файлов, но не записывается в базу данных, если я выполняю session.flush()
Мой код выглядит так:
try:
return session.query(Phone).populate_existing().filter(Phone.mac == ident).one()
except:
return self.createMockPhoneFromLicenseFile(ident)
def createMockPhoneFromLicenseFile(self, ident):
# Some code to read necessary data from file deleted....
phone = Phone()
phone.mac = foo
phone.data = bar
phone.state = "Read from legacy file"
phone.purchaseOrderPosition = self.getLegacyOrder(ident)
# SQLAlchemy magic doesn't seem to work here, probably because we don't insert the created
# phone object into the database. So we set the id fields manually.
phone.order_id = phone.purchaseOrderPosition.order_id
phone.order_position_id = phone.purchaseOrderPosition.order_position_id
return phone
Все работает нормально, за исключением того, что на session.flush()
, выполняемом позже в приложении, SQLAlchemy пытается записать созданный объект Phone в базу данных (что, к счастью, не удается, поскольку phone.state длиннее, чем позволяет тип данных), которая нарушает функцию, которая выдает сброс.
Есть ли способ предотвратить попытки SQLAlchemy написать такой объект?
Обновление
Пока я ничего не нашел на
using_mapper_options(save_on_init=False)
в документации по Elixir (может быть, вы можете предоставить ссылку?), Мне показалось, что стоит попробовать (я бы предпочел способ предотвратить запись одного экземпляра вместо всей сущности).
Сначала казалось, что утверждение не имеет никакого эффекта, и я подозревал, что мои версии SQLAlchemy / Elixir слишком старые, но потом я обнаружил, что соединение с сущностью PurchaseOrderPosition (которое я не изменял) было установлено с
phone.purchaseOrderPosition = self.getLegacyOrder(ident)
вызывает повторную запись объекта телефона. Если я уберу заявление, все будет в порядке.