【问题标题】:Sqlalchemy bulk insert with Pyramid带有 Pyramid 的 Sqlalchemy 批量插入
【发布时间】:2013-03-17 04:18:30
【问题描述】:

我有一个需要使用循环插入多次的对象。每次循环迭代我都会更改一些字段值。 我的代码是:

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

此代码仅插入单行。由于某些原因,我无法直接在“尝试块”开始时设置循环。 我做错了什么?

【问题讨论】:

    标签: python sqlalchemy pyramid


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 2011-04-09
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      相关资源
      最近更新 更多