小编Paw*_*ski的帖子

SQLAlchemy会话错误

背景: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()
Run Code Online (Sandbox Code Playgroud)

现在尝试运行它我得到一个错误:

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()
    
    Run Code Online (Sandbox Code Playgroud)

    我刚刚在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()
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

6
推荐指数
3
解决办法
4512
查看次数

标签 统计

flask-sqlalchemy ×1

python ×1

sqlalchemy ×1