我一直在尝试获取某个用户关注的所有帐户的 ID 列表。我的数据库定义如下。
UserFollowers = Table(
"UserFollowers",
Base.metadata,
Column("follower_id", Integer, ForeignKey("users.id"), primary_key=True),
Column("user_id", Integer, ForeignKey("users.id"), primary_key=True),
)
UserBlocked = Table(
"UserBlocked",
Base.metadata,
Column("user_id", Integer, ForeignKey("users.id"), primary_key=True),
Column("blocked_user_id", Integer, ForeignKey("users.id"), primary_key=True),
)
class Users(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
username = Column(String, unique=True, nullable=False)
password = Column(String, nullable=False)
email = Column(String, nullable=False)
firstname = Column(String, nullable=False)
surname = Column(String, nullable=False)
biography = Column(Text, default="I'm new! Just exploring.")
iconid = Column(Integer)
joined = Column(DateTime, nullable=False)
verified = Column(Boolean, default=False)
disabled = Column(Boolean, default=False)
moderator = Column(Boolean, nullable=False, default=False)
business = Column(Boolean, nullable=False, default=False)
public = Column(Boolean, nullable=False, default=False)
media = relationship("Media", backref="users")
posts = relationship("Posts", backref="users")
authtokens = relationship("AuthTokens", backref="users")
moderation = relationship("Moderation", backref="users")
usersettings = relationship("UserSettings", backref="users")
comments = relationship("Comments", backref="users")
likes = relationship("Likes", backref="users")
messages = relationship("Messages", backref="users")
followers = relationship(
"Users",
secondary=UserFollowers,
primaryjoin=(UserFollowers.c.user_id == id),
secondaryjoin=(UserFollowers.c.follower_id == id),
backref="following",
)
blockedusers = relationship(
"Users",
secondary=UserBlocked,
primaryjoin=(UserBlocked.c.user_id == id),
secondaryjoin=(UserBlocked.c.blocked_user_id == id),
backref="blocked_by",
)
我面临的问题是,当我尝试直接访问 user.following 对象时,我得到:
sqlalchemy.orm.exc.DetachedInstanceError: Parent instance <Users at 0x15e7251f340> is not bound to a Session; lazy load operation of attribute 'following' cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)
因此,我尝试直接访问 UserFollowers 表并使用
SELECT
语句:
stmt = select([UserFollowers.c.user_id]).where(UserFollowers.c.follower_id == user_obj.id)
其中
user_obj.id
是用户的 id,我们想要获取他所关注的人的所有 id。
此语句执行时返回以下错误:
sqlalchemy.exc.ArgumentError: Column expression, FROM clause, or other columns clause element expected, got [Column('user_id', Integer(), ForeignKey('users.id'), table=<UserFollowers>, primary_key=True, nullable=False)]. Did you mean to say select(Column('user_id', Integer(), ForeignKey('users.id'), table=<UserFollowers>, primary_key=True, nullable=False))?
任何帮助将不胜感激,我不知道如何解决这个彻底的混乱。
我已经解决了这个问题。 通过获取远程对象的所有条件,我可以避免错误并使用列表操作来获取相关结果。
stmt = select(UserFollowers.c).where(UserFollowers.c.follower_id == user_obj.id)
result = session.execute(stmt)
following_user_ids = [row[1] for row in result]
return following_user_ids
在这里我能够获取适当的数据值。