Я пытаюсь сделать массовую вставку / обновление с помощью SQLAlchemy. Вот фрагмент кода:
for od in clist:
where = and_(Offer.network_id==od['network_id'],
Offer.external_id==od['external_id'])
o = session.query(Offer).filter(where).first()
if not o:
o = Offer()
o.network_id = od['network_id']
o.external_id = od['external_id']
o.title = od['title']
o.updated = datetime.datetime.now()
payout = od['payout']
countrylist = od['countries']
session.add(o)
session.flush()
for country in countrylist:
c = session.query(Country).filter(Country.name==country).first()
where = and_(OfferPayout.offer_id==o.id,
OfferPayout.country_name==country)
opayout = session.query(OfferPayout).filter(where).first()
if not opayout:
opayout = OfferPayout()
opayout.offer_id = o.id
opayout.payout = od['payout']
if c:
opayout.country_id = c.id
opayout.country_name = country
else:
opayout.country_id = 0
opayout.country_name = country
session.add(opayout)
session.flush()
Похоже, что моя проблема была затронута здесь, http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg05983.html, но я не знаю, как использовать "текстовые предложения" с объектами запроса сеанса и не мог найти много (хотя по общему признанию у меня не было столько времени, сколько я хотел бы искать).
Я новичок в SQLAlchemy, и я предполагаю, что в коде есть некоторые проблемы, помимо того, что он вызывает исключение для дублирующего ключа. Например, выполнение сброса после каждой итерации clist (но я не знаю, как еще получить значение o.id, которое используется в последующих вставках OfferPayout).
Руководство по любому из этих вопросов очень ценится.