我在这里与用户有类似的问题:SQLAlchemy Object already attached to session
我基本上得到了相同的错误:
'<Link at 0x7f31a785f630>' is already attached to session '1' (this is '15')
我真的想弄清楚为什么只创建一个会话时会创建多个会话。我有两个文件__init__.py
和models.py
:
来自__init__.py
的兴趣线:
from .models import User, draft_new_link_message, load_history, load_messages, db
# Initialize app and such
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.secret_key = 'super secret keyssss'
socketio = SocketIO(app)
db.init_app(app)
app.app_context().push()
...
db.create_all()
来自models.py
:
db = SQLAlchemy()
class Link(db.Model):
__tablename__ = 'link'
id = db.Column(db.Integer, primary_key=True, nullable=False)
url = db.Column(db.String(500), nullable=False)
originator_id = db.Column(db.Integer, db.ForeignKey('user.id'))
originator = db.relationship("User", back_populates='history')
仅从这些方面来看,我似乎应该参加一次会议。如果不是,如何正确设置代码格式以减少麻烦并确保不必在会话之间传输对象?谢谢!
编辑:解决方案
之所以以这种方式构造项目,是因为一些文档说这是正确的模式(在您的模型文件中创建db,然后调用db.init_app()将其放入主文件)。但是我想这是个坏主意。我以为可能不得不这样做,因为我无法让两个文件互相引用。但是要解决这个问题,我在主文件中编写了一个方法来获取数据库,并在模型函数中调用了导入
我的新__init__.py
:
#初始化应用程序等
app = Flask(名称)
app.config ['SQLALCHEMY_DATABASE_URI'] ='sqlite:///browse_together.db'
app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.secret_key ='超级秘密密钥'
socketio = SocketIO(应用程序)
db = SQLAlchemy(app)
# Provide a way for models.py (and any other files that needs it) to get access to the database
def get_db():
return db
# Now you can import models.py because it can use this database
from . import urltils, models
from .models import User, Group, get_groups, create_group, \
draft_new_link_message, load_history, load_messages, toggle_send
models.py
中新的前几行:
from flask_login import UserMixin
from . import urltils
from . import get_db
# Get an instance of the db from __init__
db = get_db()
我认为这更正确。
答案 0 :(得分:1)
之所以以这种方式构造项目,是因为一些文档说这是正确的模式(在您的模型文件中创建db,然后调用db.init_app()将其放入主文件)。但是我想这是个坏主意。我以为可能不得不这样做,因为我无法让两个文件互相引用。但是要解决这个问题,我在主文件中编写了一个方法来获取数据库,并在模型函数中调用了导入
我的新__init__.py
:
# Other imports...
# Initialize app and such
app = Flask(name)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.secret_key = 'super secret keysssss'
db = SQLAlchemy(app)
# Provide a way for models.py (and any other files that needs it) to get access to the database
def get_db():
return db
# Now you can import models.py because it can use this database
from . import urltils, models
from .models import User, Group, get_groups, create_group, \
draft_new_link_message, load_history, load_messages, toggle_send
models.py
中新的前几行:
from flask_login import UserMixin
from . import urltils
from . import get_db
# Get an instance of the db from __init__
db = get_db()
我认为这更正确。