代码之家  ›  专栏  ›  技术社区  ›  marvcode

如何使用字符串来表示sqlalchemy对象属性?

  •  4
  • marvcode  · 技术社区  · 10 年前

    我正在用SQLalchemy和WTForms编写一个Flask应用程序。

    数据库更新有问题…我有很多对象表字段要更新。

    所以我从这个开始。。。

    # this works great but needs many lines of code
    event.evt_num = form.evt_num.data
    event.evt_name = form.evt_name.data
    event.evt_location = form.evt_location.data
    event.evt_address = form.evt_address.data
    event.evt_city = form.evt_city.data
    event.evt_state = form.evt_state.data
    ...
    

    虽然上面的片段有效,但实际上它是巨大的。所以我想变得更聪明,通过迭代属性来更新数据库。所以我尝试了以下方法。。。

    event_fields = ('evt_num', 'evt_name', 'evt_location', 'evt_address',
                        'evt_city', 'evt_state', 'evt_zip', 'evt_notes')
    
    for aa in event_fields:
        print "form data", getattr(form, aa).data  # prints posted form data
        print "db data", getattr(event, aa) # prints posted data from database
    
        if getattr(form, aa).data != getattr(event, aa):  # if form data shows a change
            setattr(event, aa, getattr(form, aa).data)    # update database does not work
            db_change = True
            session.flush()
            ...
    

    此行无法更新数据库:

    setattr(event, aa, getattr(form, aa).data)
    

    我收到这个错误“ AttributeError:“Event”对象没有属性“aa” "

    我们将非常感谢你的帮助。

    2 回复  |  直到 10 年前
        1
  •  2
  •   coralvanda    10 年前

    如果你这样重组呢?

    event_fields = ('evt_num', 'evt_name', 'evt_location', 'evt_address',
                'evt_city', 'evt_state', 'evt_zip', 'evt_notes')
    
    for aa in event_fields:
        form_data = getattr(form, aa).data
        db_data = getattr(event,aa)
        print "form data", form_data  # prints posted form data
        print "db data", db_data # prints posted data from database
    
        if form_data != db_data:  # if form data shows a change
            setattr(event, aa, form_data)    # update database now works
            db_change = True
            session.flush()
            ...
    

    这样,您拨打的电话更少 getattr() 并可能稍微优化您的代码。

        2
  •  0
  •   marvcode    10 年前

    根据用户:coralv的注释,我解决了这个问题,将getattr内容存储到变量中,而不是将其作为setattr函数的一部分。代码的结尾是这样的。。。

    event_fields = ('evt_num', 'evt_name', 'evt_location', 'evt_address',
                    'evt_city', 'evt_state', 'evt_zip', 'evt_notes')
    
    for aa in event_fields:
        print "form data", getattr(form, aa).data  # prints posted form data
        print "db data", getattr(event, aa) # prints posted data from database
        if getattr(form, aa).data != getattr(event, aa):  # if form data shows a change
            val = getattr(form, aa).data
            setattr(event, aa, val)    # update database now works
            db_change = True
            session.flush()
            ...