背景: Flask / Flask-SQLAlchemy / Flask-WTF、宣言型およびスコープ付きセッションを使用
簡単なPOST
操作:
@tas.route('/order_add', methods=['GET', 'POST'])
def tas_order_add():
if request.method == 'POST':
order_form = OrderForm()
if order_form.validate_on_submit():
order = Order()
order_form.populate_obj(order)
db_session.add(order)
db_session.commit()
今それを実行しようとすると、エラーが発生します:
InvalidRequestError: オブジェクト '' は既にセッション '1' にアタッチされています (これは '2' です)
add を merge に変更すると問題は解決しますが、次の点に注意してください。
- 開始したばかりのオブジェクトをマージする必要がある理由がわかりません
変更を加えてマージし、プロパティの 1 つを定義しようとすると、
order = Order() order_form.populate_obj(order) order.order_status = OrderStatus.query.filter(OrderStatus.code=='PLACED').first() db_session.merge(order) db_session.commit()
OrderStatus オブジェクトで同じエラーが発生しました
InvalidRequestError: オブジェクト '' は既にセッション '2' にアタッチされています (これは '1' です)
誰かが私が何か間違ったことをしている場所を教えてもらえますか? SQLAlchemy の経験はありますが、このような動作を目にするのは初めてで、問題を特定することはできません。
私が見つけたすべてを検索すると、二重データベースセッションの初期化の問題でしたが、このケースではないと思います。
編集
db_session は別のファイル database.py で次の内容で定義されています
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative.api import declarative_base
from sqlalchemy.orm.scoping import scoped_session
from sqlalchemy.orm.session import sessionmaker
engine = create_engine('sqlite:///fundmanager_devel.db', convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()