web-dev-qa-db-ja.com

sqlalchemy外部キー関係の属性

UserテーブルとFriendテーブルがあります。 Friendテーブルには、Userテーブルとステータスフィールドの両方に2つの外部キーがあります。 FriendオブジェクトのUserテーブルから属性を呼び出せるようにしています。たとえば、friend.name、friend.emailのようなことをしたいです。

class User(Base):
    """ Holds user info """

    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(25), unique=True)
    email = Column(String(50), unique=True)
    password = Column(String(25))
    admin = Column(Boolean)

    # relationships
    friends = relationship('Friend', backref='Friend.friend_id',primaryjoin='User.id==Friend.user_id', lazy='dynamic')

class Friend(Base):
    __tablename__ = 'friend'

    user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    request_status = Column(Boolean)

friendオブジェクトを取得すると、2つのuser_idsと私は各ユーザーのすべてのプロパティを表示したいので、フォームなどでその情報を使用できます。私はsqlalchemyを初めて使用します。さらに高度な機能を学ぼうとしています。これは、より大きなFlaskプロジェクトからのスニペットであり、この機能はfriendリクエストなどに使用されます。関連オブジェクトなどを検索しようとしましたが、私はそれで苦労しています。

どんな助けも大歓迎です。

31
Ptrkcon

まず、flask-sqlalchemyを使用している場合、Flaskのdb.Modelの代わりにsqlalchemyを直接使用しているのはなぜですか?

flask-sqlalchemy 拡張機能を使用することを強くお勧めします。これは、セッションやその他の便利な機能を活用するためです。

プロキシコンビニエンスオブジェクトの作成は簡単です。それとの関係をFriendクラスに追加するだけです。

class Friend(Base):
    __tablename__ = 'friend'

    user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    request_status = Column(Boolean)

    user = relationship('User', foreign_keys='Friend.user_id')
    friend = relationship('User', foreign_keys='Friend.friend_id')

SQLAlchemyが残りを処理し、次の方法でユーザーオブジェクトにアクセスできます。

name = friend.user.name

userオブジェクトを使用するたびにfriendオブジェクトを使用する場合は、relationshiplazy='joined'を指定します。この方法では、単一のクエリで両方のオブジェクトをロードします。

42
Paolo Casciello