【问题标题】:Flask-SQLAlchemy Model Relationships and QueryFlask-SQLAlchemy 模型关系和查询
【发布时间】:2019-11-06 11:11:16
【问题描述】:

我的 Flask 应用中有以下 SQLAlchemy 模型:

class User(UserMixin, db.Model):
    __tablename__ = "users"

    # relationships
    instruments = db.relationship(
        Instrument, backref="instruments", passive_deletes=True, lazy="dynamic"
    )
    transactions = db.relationship(
        Transaction, backref="transactions", passive_deletes=True, lazy="dynamic"
    )
    round_trips = db.relationship(
        RoundTrip, backref="round_trips", passive_deletes=True, lazy="dynamic"
    )

    # columns
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(24), unique=True, index=True)

class Instrument(db.Model):
    __tablename__ = "instruments"

    # relationships
    user = db.relationship("User")
    transaction = db.relationship(
        Transaction, uselist=False, backref="transaction", passive_deletes=True
    )

    # columns
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(
        db.Integer,
        db.ForeignKey("users.id", onupdate="CASCADE", ondelete="CASCADE"),
        index=True,
        nullable=False,
    )
    symbol = db.Column(db.String(100), index=True)

class Transaction(db.Model):
    __tablename__ = "transactions"

    # relationships
    user = db.relationship("User")
    instrument = db.relationship("Instrument")
    transaction_round_trip_mapping = db.relationship(
        "RoundTripTransactionMapping",
        backref="round_trip_mappings",
        passive_deletes=True,
        lazy="dynamic",
    )

    # columns
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(
        db.Integer,
        db.ForeignKey("users.id", onupdate="CASCADE", ondelete="CASCADE"),
        index=True,
        nullable=False,
    )
    instrument_id = db.Column(
        db.Integer,
        db.ForeignKey("instruments.id", onupdate="CASCADE", ondelete="CASCADE"),
        index=True,
        nullable=False,
    )
    amount = db.Column(db.Float, nullable=False)

class RoundTrip(ResourceMixin, db.Model):
    __tablename__ = "round_trips"

    # relationships
    user = db.relationship("User")
    transaction_round_trip_mapping = db.relationship(
        "RoundTripTransactionMapping", backref="transaction_mappings", passive_deletes=True, lazy="dynamic"
    )

    # columns
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(
        db.Integer,
        db.ForeignKey("users.id", onupdate="CASCADE", ondelete="CASCADE"),
        index=True,
        nullable=False,
    )

class RoundTripTransactionMapping(db.Model):
    __tablename__ = "round_trip_transaction_mappings"

    # relationships
    round_trip = db.relationship("RoundTrip")
    transaction = db.relationship("Transaction")

    # columns
    id = db.Column(db.Integer, primary_key=True)
    round_trip_id = db.Column(
        db.Integer,
        db.ForeignKey("round_trips.id", onupdate="CASCADE", ondelete="CASCADE"),
        index=True,
        nullable=False,
    )
    transaction_id = db.Column(
        db.Integer,
        db.ForeignKey("transactions.id", onupdate="CASCADE", ondelete="CASCADE"),
        index=True,
        nullable=False,
    )
    closing_transaction = db.Column(db.Boolean, nullable=False)

User 可以有一个或多个 Transactions。一个User 可以有一个或多个Instruments。一个Transaction 可以有一个Instrument。一个RoundTrip 可以有一个或多个Transactions。

RoundTripTransactionMapping 模型只是一个将RoundTrip 绑定到一个或多个Transactions 的映射表。

我想用Instrument.symbol == "GOOG"查询所有RoundTrips。

如何使用 SQLAlchemy 的 ORM 做到这一点?

(我是否正确定义了这些关系?我对此有点迷茫。)

【问题讨论】:

  • 我在RoundTripTransactionMapping 上迷路了。把一个交易可以经历几个阶段而你只保留这些不同阶段的TransactionHistory 来构建它不是更有意义吗?也许这就是你所做的,但问题的框架让我感到困惑

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

整理了一下,其实很简单。 join 上的 SQLAlchemy 文档挽救了这一天。

result = (
    db.session.query(RoundTrip)
    .join(RoundTripTransactionMapping)
    .join(Transaction)
    .join(Instrument)
    .filter(Instrument.symbol == "GOOG")
    .all()
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-03-10
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多