У меня есть похожая проблема для пользователя: Объект SQLAlchemy уже присоединен к сеансу
И я получаю в основном ту же ошибку:
'<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')
Отодни только эти строки, кажется, я должен быть на одном сеансе.Если нет, как правильно отформатировать код, чтобы уменьшить головную боль и избежать переноса объектов между сеансами?Спасибо!
Редактировать: Решение
Причина, по которой я структурировал свой проект таким образом, заключалась в том, что в нескольких частях документации говорилось, что это правильный шаблон (создание БД внутри вашегофайл моделей, а затем вызов dng.init_app (), чтобы получить его в основной файл).Но я думаю, это была плохая идея.Я подумал, может быть, мне нужно, потому что я не могу, чтобы оба файла ссылались друг на друга.Но чтобы обойти это, я написал метод в главном файле, чтобы получить базу данных, и вызвал функцию импорта для моделей
Мой новый __init__.py
: # Инициализировать приложение и такое приложение = Flask ( name.SQLAlchemy (приложение)
# 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()
Я думаю, что это более правильно.