您的位置:首页 > 编程语言 > Python开发

「Python」 flask使用SQLAlchemy时报错: sqlalchemy.exc.InvalidRequestError: Object '

2019-01-19 10:09 106 查看

报错:

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())
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: