美文网首页
「Python」 flask使用SQLAlchemy时报错: s

「Python」 flask使用SQLAlchemy时报错: s

作者: ray_1942 | 来源:发表于2019-01-19 10:09 被阅读0次

    报错:

     sqlalchemy.exc.InvalidRequestError: Object '<Model at 0x7fe27328e898>' is already attached to session '2' (this is '3')
    
    

    问题:

    session交叉混用

    分析:

    1、我的项目中项目采用了维护单一db的方式;
    2、既然是session混用说明又创建了一个db,执行了db.session
    3、我的项目中只在app.py中维护了一个db,视图函数中from app import db,所以可以推测是在当前发生session混用的视图函数中产生了新db,并执行了db.session
    4、而哪里执行了SQLAlchemy(),哪里就产生了新db
    5、但是发生混用的视图函数并没有找到SQLAlchemy()
    6、视图函数
     1   req = request.args
     2   id = int(req.get('id',0))
     3   model = Model.query.filter_by(id=id).first()
     4   model.name = name
     5   model.updated_time = now()
     6   db.session.add(model)
     7   db.session.commit()
    
    7、读到line7 Model采用了sqlacodegen生成模型文件

    使用命令生成ORM模型

     flask-sqlacodegen 'mysql://root:123456@127.0.0.1/haha' --tables model --outfile "common/models/model.py" --flask
    

    生成模型文件model.py如下:

      1  # coding: utf-8
      2  from sqlalchemy import Column, DateTime, Integer, String
      3  from sqlalchemy.schema import FetchedValue
      4  from flask_sqlalchemy import SQLAlchemy
      5  from app import app
      6
      7  db = SQLAlchemy()
      8
      9  class Model(db.Model):
     10   __tablename__ = 'model'
     11
     12   id = db.Column(db.Integer, primary_key=True, unique=True)
     13   name = db.Column(db.String(50), nullable=False, server_default=db.FetchedValue())
    
    8、问题基本明了,是生成的类文件中自带了一句db = SQLAlchemy()

    解决办法:

    1、

     6   db.session.add(model)
     7   db.session.commit()
    ```更换为```
     6   db.session.query(Model).filter_by(id=id).update({'name': model.name})
    

    2、

          
     1   req = request.args
     2   id = int(req.get('id',0))
     3   '''追加一句'''
     4   from model.Model import db 
     5   model = Model.query.filter_by(id=id).first()
     6   model.name = name
     7   model.updated_time = now()
     8   db.session.add(model)
     9   db.session.commit()
    
    以上俩种办法是可以修改数据正常运行,但是并不符合我项目需求,根本问题没有解决。1可以解决维护一个db的问题,但是操作起来不方便。2操作简单但是不符合单一db的要求。

    3、
    修改orm模型如下:

      5  from app import app
      6
      7  db = SQLAlchemy()
    
      1  # coding: utf-8
      2  from sqlalchemy import Column, DateTime, Integer, String
      3  from sqlalchemy.schema import FetchedValue
      4  from flask_sqlalchemy import SQLAlchemy
      5  from app import db,app
      6
      7  class Model(db.Model):
      8   __tablename__ = 'model'
      9
     10   id = db.Column(db.Integer, primary_key=True, unique=True)
     11   name = db.Column(db.String(50), nullable=False, server_default=db.FetchedValue())
    

    相关文章

      网友评论

          本文标题:「Python」 flask使用SQLAlchemy时报错: s

          本文链接:https://www.haomeiwen.com/subject/aijadqtx.html