Уведомления

Группа в Telegram: @pythonsu

#1 Март 15, 2013 12:11:45

dorian
От:
Зарегистрирован: 2006-05-18
Сообщения: 79
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlalchemy множественный insert объекта

Есть объект, который нужно много раз вставить в базу, изменяя одно из полей.

            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(). Всегда сохраняется лишь одна запись.



Офлайн

#2 Март 15, 2013 18:46:11

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Sqlalchemy множественный insert объекта

Если хочется много объектов, то наверное надо так

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)

Отредактировано bismigalis (Март 16, 2013 16:49:14)

Офлайн

#3 Март 16, 2013 00:52:14

sakal
От:
Зарегистрирован: 2012-01-13
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlalchemy множественный insert объекта

Предлагаю посмотреть слайд по профайлингу начиная с 15-го
python profile



Офлайн

#4 Март 16, 2013 11:05:59

dorian
От:
Зарегистрирован: 2006-05-18
Сообщения: 79
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlalchemy множественный insert объекта

bismigalis
Если хочется много объектов, то наверное надо так
Есть заготовка объекта и с этой заготовкой нужно провести операции вставки с разными вариациями некоторых полей. Таких циклов, как представлено выше, может быть не 1 и не 2 а побольше. Поэтому нужен именно такой вариант.



Офлайн

#5 Март 16, 2013 11:48:33

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Sqlalchemy множественный insert объекта

Такой вариант не сработает, маппер на то и маппер, что инстанс в памяти мапится на истанс в базе.
Можно наверное копировать объект из заготовки. Хотя это будет не очень эффективно если тысячи объектов, как подсказывает sakal, и тогда только спускаться на уровень core или SQL, как показано в презентации.

Отредактировано bismigalis (Март 16, 2013 11:51:52)

Офлайн

#6 Март 16, 2013 15:26:13

dorian
От:
Зарегистрирован: 2006-05-18
Сообщения: 79
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlalchemy множественный insert объекта

Решение
в модели

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)
уверен, кому-то пригодится



Отредактировано dorian (Март 16, 2013 15:28:20)

Офлайн

#7 Март 16, 2013 16:21:42

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Sqlalchemy множественный insert объекта

зачем такой оверхед делать? вынести константы в атрибуты класса нельзя чтоли?

Офлайн

#8 Март 18, 2013 18:59:11

dorian
От:
Зарегистрирован: 2006-05-18
Сообщения: 79
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlalchemy множественный insert объекта

sergeek
зачем такой оверхед делать? вынести константы в атрибуты класса нельзя чтоли?
нет здесь констант.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version