[英]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.