使用 SQLAlchemy 和 python。我怎样才能克服延迟加载/参数错误

问题描述 投票:0回答:1

我一直在尝试获取某个用户关注的所有帐户的 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))?

任何帮助将不胜感激,我不知道如何解决这个彻底的混乱。

python sqlite sqlalchemy reference
1个回答
0
投票

我已经解决了这个问题。 通过获取远程对象的所有条件,我可以避免错误并使用列表操作来获取相关结果。

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

在这里我能够获取适当的数据值。

© www.soinside.com 2019 - 2024. All rights reserved.