2012-07-02 42 views
14

Ứng dụng của tôi sử dụng kết hợp Flask, Flask-SQLAlchemy, Flask-WTF và Jinja2.Flask-SQLAlchemy: Cách điều kiện chèn hoặc cập nhật hàng

Trong hiện thân hiện tại của nó, tôi có bảng cài đặt. Bảng sẽ chỉ có một bản ghi với một trường. Ban đầu bảng chứa 0 bản ghi.

Những gì tôi muốn đạt được là:

  • Cho rằng không có mục tồn tại trong db, sau đó hiển thị dưới dạng trống sẵn sàng cho người dùng nhập vào
  • Cho rằng một mục tồn tại, cho thấy sự xâm nhập, và
  • nếu người dùng thay đổi giá trị, sau đó cập nhật rec trong db.

Đây là mã của tôi:

models.py

class Provider(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    rssfeed = db.Column(db.String(120), unique = True) 

    def __init__(self, rssfeed): 
     self.rssfeed = rssfeed 

    def __repr__(self): 
     return '<NZBMatrix feed url %r>' % self.rssfeed 

forms.py

class SettingsForm(Form): 
    rssfeed = TextField('rssfed', validators= [Required()]) 

views.py

@app.route('/settings', methods=["GET","POST"]) 
    def settings(): 
    """ show settings """ 
     provider = Provider.query.get(1) 
     form = SettingsForm(obj=provider) 
     print provider 

     if request.method == "POST" and form.validate(): 
      if Provider.query.get(1) is None: 
       provider = Provider(rssfeed=form.rssfeed.data) 
       form.populate_obj(provider) 
       db.session.add(provider) 
       db.session.commit() 
       flash("Settings added") 

     return render_template("settings.html", form=form) 

Vì nó là viết tắt của mã này tạo bản ghi nếu nó không tồn tại nhưng cột rssfeed trống.

Làm cách nào để thay đổi mã này để nó INSERT nếu bản ghi không tồn tại và UPDATE nếu có?

+1

Chỉ cần FYI - 'form.validate' nên là' form.validate() '- một hàm luôn luôn đúng, nhưng biểu mẫu * của bạn có thể * không vượt qua xác thực. –

+0

Cảm ơn bạn đã chỉ ra điều đó! – happygoat

Trả lời

28

Khi mẫu của bạn được xác nhận vv,

Để thêm một kỷ lục mới:

new_provider = Provider(form.rssfeed.data) 
db.session.add(new_provider) 
db.session.commit() 

Để cập nhật bản ghi hiện có:

existing_provider = Provider.query.get(1) # or whatever 
# update the rssfeed column 
existing_provider.rssfeed = form.rssfeed.data 
db.session.commit() 

Bí quyết trong việc cập nhật là bạn chỉ cần thay đổi trường cụ thể và thực hiện cam kết. phần còn lại được chú ý bởi phiên db. Tôi nghĩ rằng bạn đang sử dụng chức năng hợp nhất mà bây giờ không được chấp nhận trong SQLAlchemy.

4

tôi đã quản lý để giải quyết vấn đề làm những thay đổi đối với view.py file:

@app.route('/settings', methods=["GET","POST"]) 
def settings(): 
    """ show settings """ 
    provider = Provider.query.get(1) 
    form = SettingsForm(request.form,obj=provider) 

    if request.method == "POST" and form.validate(): 
     if provider: 
      provider.rssfeed = form.rssfeed.data 
      db.session.merge(provider) 
      db.session.commit() 
      flash("Settings changed") 
      return redirect(url_for("index")) 
     else: 
      provider = Provider(form.rssfeed.data) 
      db.session.add(provider) 
      db.session.commit() 
      flash("Settings added") 
      return redirect(url_for("index")) 
    return render_template("settings.html", form=form) 
Các vấn đề liên quan