【问题标题】:Flask objects on multiple sessions when they not should be不应在多个会话上烧瓶对象
【发布时间】:2019-04-25 16:31:52
【问题描述】:

这里的用户有类似的问题:SQLAlchemy Object already attached to session

我得到了基本相同的错误:

'<Link at 0x7f31a785f630>' is already attached to session '1' (this is '15')

我真的想弄清楚为什么要创建多个会话,而我只想要一个。我有两个文件__init__.pymodels.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 = '超级秘钥ssss' 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()

我认为这更正确。

【问题讨论】:

  • 你在哪里创建了一个会话?
  • 我从未明确创建过会话...我应该有吗?每当我想使用会话时,我都会调用 db.session。我做错了什么?用更多可能有用也可能没有帮助的代码更新了帖子。
  • 当引导应用程序不在模型中时,您应该定义 db,请参阅flask-sqlalchemy.pocoo.org/2.3/quickstart
  • @mirhossein 那么我如何从内部模型中引用 db?
  • 谢谢@mirhossein,我认为这是一个很好的建议,比我之前的做法更好。我在下面发布了我的解决方案。

标签: python session flask


【解决方案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()

我认为这更正确。

【讨论】:

    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    相关资源
    最近更新 更多