Background: Flask / Flask-SQLAlchemy / Flask-WTF, using declarative and scoped session
Simple POST
operation:
@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()
Now trying to run it I get an error:
InvalidRequestError: Object '' is already attached to session '1' (this is '2')
Changing add to merge solves the problem, but:
- I don't know why do I have to merge an object while I just initiated it
If I do change add to merge and try to define one of the properties something in line
order = Order()
order_form.populate_obj(order)
order.order_status = OrderStatus.query.filter(OrderStatus.code=='PLACED').first()
db_session.merge(order)
db_session.commit()
I get the same error, just now on OrderStatus object
InvalidRequestError: Object '' is already attached to session '2' (this is '1')
Can someone point me where I'm doing something wrong because it's driving me nuts. I do have some experience with SQLAlchemy but it's the first time I see such a behaviour and I can't pinpoint the problem.
Searching all I found was a problem with double database session initialization but I don't belive it's this case.
EDIT
db_session is defined in separate file database.py with following content
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()
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…