【发布时间】:2023-04-10 19:20:01
【问题描述】:
背景: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”)
将添加更改为合并可以解决问题,但是:
- 我不知道为什么我刚刚启动它时必须合并一个对象
-
如果我确实将添加更改为合并并尝试在行中定义其中一个属性
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()
【问题讨论】:
-
db_session 在哪里定义?你能添加代码吗?
-
添加为问题的编辑
标签: python sqlalchemy flask-sqlalchemy