简体   繁体   English

Sqlalchemy带有金字塔的批量插入

[英]Sqlalchemy bulk insert with Pyramid

I have an object that I need to insert several times using loop. 我有一个对象,需要使用循环多次插入。 Every loop iteration I change some fields values. 每次循环迭代时,我都会更改一些字段值。 My code is: 我的代码是:

@view_config(route_name="be.bautocredits.rates.add",
             request_method="POST",
             permission="admin",
             renderer="json")
def _add_rates(self):
    _ = self.request.translate
    controls = self.request.POST.items()
    schema = AutocreditRateSchema()
    try:
        schema.deserialize(controls)
        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.min_cost_currency = Currency.by_rid(self.request.POST.get('min_cost_currencies_rid'))
        rate.max_cost_currency = Currency.by_rid(self.request.POST.get('max_cost_currencies_rid'))
        rate.min_currency = Currency.by_rid(self.request.POST.get('min_currencies_rid'))
        rate.max_currency = Currency.by_rid(self.request.POST.get('max_currencies_rid'))
        rate.manufacturer = Manufacturer.by_rid(self.request.POST.get('_manufacturers_rid'))
        rate.autocredit.updated = datetime.datetime.now()

        _cars_rids = list(set(self.request.POST.getall('_cars_rid')))
        if _cars_rids:
            for _cars_rid in _cars_rids:
                rate.car = Car.by_rid(_cars_rid)
                DBSession.add(rate)
        else:
            DBSession.add(rate)

    except colander.Invalid, e:
        return dict(errors=dict(e.asdict().items()+dict(status_bar=_(u'Check errors')).items()))
    return dict()

This code inserts only single row. 此代码仅插入单行。 For some reasons I can't set loop directly in "try block" begins. 由于某些原因,我无法直接在“ try block”开始中设置循环。 What i'm doing wrong? 我做错了什么?

DBSession.add adds an object to session (as the name implies) - at that time no SQL queries are emitted, .add just makes the session aware of the object. DBSession.add将一个对象添加到会话中(顾名思义)-那时没有发出SQL查询, .add只是使会话知道该对象。

You can continue to modify the object's properties until the session is committed - regardless of how many times you've added the object to the session only one row will be added to the database. 您可以继续修改对象的属性,直到提交会话为止-不管您将对象添加到会话中的次数是多少,数据库中只会添加一行。

You may be able to do what you're trying to do with some clever session flushing, but, seriously, why not just create a separate object for each row? 也许可以通过一些聪明的会话刷新来完成您想做的事情,但是,认真的说,为什么不为每一行创建一个单独的对象呢? That's how ORMs work in general. 这就是ORM通常的工作方式。

def _add_rates(self):
    _ = self.request.translate
    controls = self.request.POST.items()
    schema = AutocreditRateSchema()
    try:
        schema.deserialize(controls)
        _cars_rids = list(set(self.request.POST.getall('_cars_rid')))
        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'))
        min_cost_currency = Currency.by_rid(self.request.POST.get('min_cost_currencies_rid'))
        max_cost_currency = Currency.by_rid(self.request.POST.get('max_cost_currencies_rid'))
        min_currency = Currency.by_rid(self.request.POST.get('min_currencies_rid'))
        max_currency = Currency.by_rid(self.request.POST.get('max_currencies_rid'))
        manufacturer = Manufacturer.by_rid(self.request.POST.get('_manufacturers_rid'))
        if _cars_rids:
            for _cars_rid in _cars_rids:
                rate = AutocreditRate(autocredit=autocredit, carshow=carshow, ...)
                rate.car = Car.by_rid(_cars_rid)
                rate.autocredit.updated = datetime.datetime.now()
                DBSession.add(rate)
        else:
            rate = AutocreditRate(autocredit=autocredit, carshow=carshow, ...)
            rate.autocredit.updated = datetime.datetime.now()
            DBSession.add(rate)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM