Найти - Пользователи
Полная версия: Sqlalchemy множественный insert объекта
Начало » Базы данных » Sqlalchemy множественный insert объекта
1
dorian
Есть объект, который нужно много раз вставить в базу, изменяя одно из полей.
            rate = AutocreditRate()
            rate.autocredit = Autocredit.by_rid(self.request.POST.get('_autocredits_rid'))
            rate.carshow = Carshow.by_rid(self.request.POST.get('_carshows_rid'))
            rate.currency = Currency.by_rid(self.request.POST.get('_currencies_rid'))
            # ----------------------
            rate.manufacturer = Manufacturer.by_rid(self.request.POST.get('_manufacturers_rid'))
            for _cars_rid in _cars_rids:
                    rate.car = Car.by_rid(_cars_rid)
                    DBSession.add(rate)
                    DBSession.flush()
пробовал с flush и без, с add_all тоже, пробовал copy.copy(). Всегда сохраняется лишь одна запись.
bismigalis
Если хочется много объектов, то наверное надо так
autocredit = Autocredit.by_rid(self.request.POST.get('_autocredits_rid'))
carshow = Carshow.by_rid(self.request.POST.get('_carshows_rid'))
currency = Currency.by_rid(self.request.POST.get('_currencies_rid'))
manufacturer = Manufacturer.by_rid(self.request.POST.get('_manufacturers_rid'))
for _cars_rid in _cars_rids:
    rate = AutocreditRate()
    rate.autocredit = autocredit
    rate.carshow = carshow
    rate.currency = currency
    rate.manufacturer = manufacturer
    rate.car = Car.by_rid(_cars_rid)
    DBSession.add(rate)
sakal
Предлагаю посмотреть слайд по профайлингу начиная с 15-го
python profile
dorian
bismigalis
Если хочется много объектов, то наверное надо так
Есть заготовка объекта и с этой заготовкой нужно провести операции вставки с разными вариациями некоторых полей. Таких циклов, как представлено выше, может быть не 1 и не 2 а побольше. Поэтому нужен именно такой вариант.
bismigalis
Такой вариант не сработает, маппер на то и маппер, что инстанс в памяти мапится на истанс в базе.
Можно наверное копировать объект из заготовки. Хотя это будет не очень эффективно если тысячи объектов, как подсказывает sakal, и тогда только спускаться на уровень core или SQL, как показано в презентации.
dorian
Решение
в модели
def __copy__(self):
    _rate = AutocreditRate()
    for prop in object_mapper(self).iterate_properties:
        if (isinstance(prop, ColumnProperty) or isinstance(prop, RelationshipProperty) and prop.secondary):
                setattr(_rate, prop.key, getattr(self, prop.key) if prop.key!='rid' else None)
    return _rate
обратите внимание, что primary_key нужно игнорировать!
далее
_cars_rids = list(set(self.request.POST.getall('_cars_rid')))
for i, _cars_rid in enumerate(_cars_rids):
    rate.car = Car.by_rid(_cars_rid)
    if not i:
        DBSession.add(rate)
    else:
        new_rate = copy.copy(rate)
        DBSession.add(new_rate)
уверен, кому-то пригодится
sergeek
зачем такой оверхед делать? вынести константы в атрибуты класса нельзя чтоли?
dorian
sergeek
зачем такой оверхед делать? вынести константы в атрибуты класса нельзя чтоли?
нет здесь констант.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB