簡體   English   中英

Sqlalchemy帶有金字塔的批量插入

[英]Sqlalchemy bulk insert with Pyramid

我有一個對象,需要使用循環多次插入。 每次循環迭代時,我都會更改一些字段值。 我的代碼是:

@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()

此代碼僅插入單行。 由於某些原因,我無法直接在“ try block”開始中設置循環。 我做錯了什么?

DBSession.add將一個對象添加到會話中(顧名思義)-那時沒有發出SQL查詢, .add只是使會話知道該對象。

您可以繼續修改對象的屬性,直到提交會話為止-不管您將對象添加到會話中的次數是多少,數據庫中只會添加一行。

也許可以通過一些聰明的會話刷新來完成您想做的事情,但是,認真的說,為什么不為每一行創建一個單獨的對象呢? 這就是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