В приведенном ниже примере я создаю новый объект UserRelationship
с именем new_follow
, который затем пытаюсь добавить в поле user.follows с помощью этой команды:
self.follows.append(new_follow)
однако, когда я вызываю breakpoint () во время выполнения, я вижу, что новый экземпляр объекта UserRelationship был создан достаточно хорошо, но вызов self.follows.append(new_follow)
просто ничего не делает. Если я тогда позвоню self.follows.all()
, это выдаст мне пустой список как []
.
Справочная информация: это работало в Flask
, и я теперь перешел на Fast API, я считаю, что моя БД настроена несколько иначе. Конфигурация БД находится внизу.
from .database import SessionLocal
db = SessionLocal()
class UserRelationship(Base):
__tablename__ = 'userrelationship'
id = Column(Integer, primary_key=True)
follows_id = Column(Integer, ForeignKey('user.id'))
follower_id = Column(Integer, ForeignKey('user.id'))
followed = relationship("User", foreign_keys=[follows_id])
follower = relationship("User", foreign_keys=[follower_id])
budget = Column(Float(decimal_return_scale=8), default=0)
trade_size_percentage = Column(Float(decimal_return_scale=2), default=None)
approved = Column(Boolean(), default=False)
extend_existing = True
def __repr__(self):
return f'{self.follower.username} follows {self.followed.username} with {self.budget}'
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
username = Column(String(64), index=True, unique=True)
follows = relationship('UserRelationship',
primaryjoin=(UserRelationship.follower_id == id),
backref=backref('followers'),
lazy='dynamic',
cascade='all, delete')
def follow(self, user):
if not self.is_following(user):
new_follow = UserRelationship(budget=budget, followed=user, follower=self)
self.follows.append(new_follow)
db.commit()
breakpoint()
return new_follow
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import os
from dotenv import load_dotenv
load_dotenv()
SQLALCHEMY_DATABASE_URL = os.environ.get('SQLALCHEMY_DATABASE_URI')
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
ОБНОВЛЕНИЕ:
Я видел, что вызванный db.commit()
на конечной точке, а не на самой модели, означает объект UserRelationship сохраняется в базе данных. Как я могу создать «сеанс» для использования непосредственно в моих моделях, а также сеанс, вызываемый через инфраструктуру (Fast API)? Платформа создает новый сеанс для каждого запроса, который я затем использую в конечной точке, db= get_db()
, поэтому db.commit()
et c. Как получить такую же функциональность на моих моделях?
# Dependency
def get_db():
try:
db = SessionLocal()
yield db
finally:
db.close()