1

私は次のモデルを持っています:

class Employee (Base):
    __tablename__ = 'employees'

    id       = Column(Integer, primary_key=True, autoincrement=True)
    name     = Column(String(300), unique=True, nullable=False)
    phone_a  = Column(String(20), nullable=False)
    phone_b  = Column(String(20))
    email_a  = Column(String(400), nullable=False)
    email_b  = Column(String(400))
    address  = Column(String)
    charge   = Column(String(100), nullable=False)
    active   = Column(Boolean, default=True)

    created  = Column(DateTime, nullable=False, default=datetime.datetime.now)
    modified = Column(DateTime, onupdate=datetime.datetime.now)

    def __init__(self):
        self.active  = True
        self.created = datetime.datetime.now()

    def __unicode__(self):
        return self.name

非常に基本的な追加ビューを作成しました。

employee = Employee()
form     = Form(request, EmployeeSchema(), obj = employee)

if form.validate():
    employee = form.bind(Employee())
    try:
        DBSession.add(employee)
        DBSession.flush()
        return HTTPFound(location = request.route_url('employees'))
    except IntegrityError:
        message = 'Oops!'

そして、それはうまく機能します。しかし、UPDATE ビューはそうではありません。保存しないだけです。チュートリアルによると、基本的に同じコードで動作するはずです。しかし、そうではありません.SQLAlchemyは、単に更新するのではなく、新しいオブジェクトを挿入しようとします. 私は試した

import transaction
transaction.commit()

しかし、成功しません。

_id = request.matchdict['employeeid']
employee = DBSession.query(Employee).filter_by(id=_id).first()
form     = Form(request, EmployeeSchema(), obj = employee)

if form.validate():
    employee    = form.bind(Employee())
    try:
        DBSession.add(employee)
        return HTTPFound(location = request.route_url('employees'))
    except IntegrityError:
        message = ''
4

1 に答える 1

4

アイテムにバインドする必要があります。新しいインスタンスを追加する必要はありません:Employee()

_id = request.matchdict['employeeid']
employee = DBSession.query(Employee).get(_id)
form     = Form(request, EmployeeSchema(), obj=employee)

if form.validate():
    form.bind(employee)
    return HTTPFound(location = request.route_url('employees'))

それでおしまい。

于 2013-06-07T21:28:38.270 に答える