2017-11-03 1 views
0

sqlalchemyの新機能です。同じモデルの単一トランザクションで追加と更新を行いたいと思います。コードスニペットは以下のとおりです。 のようなエラーを投げたアプリケーションは、「セッション」オブジェクトはありません属性「更新」あなたは、その状態がすでに変更のために追跡されたセッションにモデルオブジェクトを追加しましたシングルコミットでsqlalchemyを追加して更新する

current_date = datetime.datetime.now() 
try: 
    session = Session() 
    user = UserProvision() 
    user.username = admin["username"] 
    user.password= admin["password"] 
    user.client_id= admin["client_id"] 
    user.fname= admin["fname"] 
    user.lname= admin['lname'] 
    user.phone= admin['phone'] 
    session.add(user) 
    session.flush() 
    user_id = user.user_id 
    user.name = admin["fname"]+" "+admin["lname"] 
    user.setCreated_by=user_id 
    user.setModified_by=user_id 
    user.setCreated_name=admin["fname"]+" "+admin["lname"] 
    user.setModified_name=admin["fname"]+" "+admin["lname"] 
    user.setLast_reset_date=current_date 
    user.setLast_reset_by = current_date 
    session.update(user) 
    session.flush() 
    session.commit() 
except Exception as ex: 
    print ex.__str__() 
finally: 
    session.close() 
+0

その重複した質問は、親切にリンクを提供してください。ありがとう – Sid

答えて

2

を持っています。明示的にそれを更新済みとしてマークする必要はなく、あなたが指摘したように、そのような方法はありませんSession.update()。単にその行を削除すれば、コードは期待通りに機能するはずです。トラッキングは、モデルクラスのinstrumentationによって達成さ

属性:

SQLAlchemyのmappingプロセスは、とりわけ、追加データベース対応各々は、特にデータベース列または関係を表すマップされたクラスにdescriptorsを関連するクラス。言い換えれば

モデルクラスはColumn属性構成され

は、他のものの間の値に変更を追跡することを InstrumentedAttribute記述インスタンスに置き換えられます。ただ Session.commit()前に手動でフラッシュする必要がないことを

注:

フラッシュ保留中の変更や現在のトランザクションをコミットします。

関連する問題