Sqlalchemy未将对象更改提交到postgres数据库

2024-03-29 13:46:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下代码段:

@app.route('/budget_item/<int:budget_id>/edit', methods=['GET', 'POST'])
   def budget_item_edit(budget_id):


budget_item = session.query(Budget).filter_by(id=budget_id).one()
print "Start EDIT sequence"


# Return form data from HTML initial load form
elif request.method == 'POST':

  budget_amount_reallocated_total = budget_item.budget_amount_reallocated_total


  #ORIGINAL BUDGET
  if request.form['transaction_type'] == 'Original Budget':

    #amount
    if request.form['amount'] == "":
      amount = 0
    else:
      amount = float(str(request.form['amount']))

    budget_item = Budget(
      #created_date = "",
      budget_transaction_type = request.form['transaction_type'],
      budget_line = request.form['budget_line'],
      amount = amount,
      description = request.form['description']
      #date_received = request.form['date_received']
      )

    try:
      count = 1

      while count < 10000:
        count += 1

        #budget_line
        setattr(budget_item,'budget_line'+str(count),request.form['budget_line'+str(count)])

        #amount
        setattr(budget_item,'amount'+str(count),float(request.form['amount'+str(count)]))
        budget_amount_reallocated_total += float(request.form['amount'+str(count)])
        setattr(budget_item, 'budget_amount_reallocated_total', budget_amount_reallocated_total)

        #description
        setattr(budget_item,'description'+str(count), request.form['description'+str(count)])

        #date_received
        setattr(budget_item,'date_received'+str(count),request.form['date_received'+str(count)])
        session.commit()

    except:
      session.commit()
      return redirect(url_for('budget_master'))

  else:
    print "I'm done! This is not a post request"

这段代码被设置为通过POST请求从HTML传递数据,然后在Postgres数据库中更新相应的对象。我可以确认从DB“budget_item”查询的对象正在被settattr更新。在本文的最后,我使用commit()更新对象;但是,数据库没有反映这些更改。只是为了测试一下,以确保一切顺利进行,我已经试过了会话.add(预算项目)后接会话.提交()以确保与数据库的连接正常。这很管用。如何将此预算项目对象更新到数据库中?任何帮助都是非常感谢的。在


Tags: formiddaterequestcountlinedescriptionitem
2条回答

要回答您的问题,要更新数据库中已经存在的budget_item,您需要更新从数据库中检索到的Budget实例,即

budget_item = session.query(Budget).filter_by(id=budget_id).one()

不是您新创建的:

^{pr2}$

这里的第一个budget_item表示数据库中的行,因此这是要更新的行。为此,您可以将创建第二个Budget实例的代码替换为:

budget_item.budget_transaction_type = request.form['transaction_type']
budget_item.budget_line = request.form['budget_line']
budget_item.amount = amount
budget_item.description = request.form['description']

更新完Budget实例后,可以调用session.commit()将其刷新到数据库中。在

正如我在对您的问题的评论中所提到的,您似乎正在尝试向budget_item添加大量附加属性,所有这些属性都将被sqlalchemy忽略,除非它们是在Budget实例与Budget表之间的映射中定义的。在

我认为一个简单的

budget_item.budget_amount_reallocated_total = budget_amount_reallocated_total
session.add(budget_item)
session.commit()

是正确的方法

相关问题 更多 >