【问题标题】:Use a SQL view with a SQLAlchemy ORM class?使用带有 SQLAlchemy ORM 类的 SQL 视图?
【发布时间】:2022-01-21 02:07:12
【问题描述】:

在我的 Postgres 数据库中,我有一个名为操作的表。我发现自己一遍又一遍地执行相同的复杂查询,因此我决定创建一个视图(组合)。

CREATE TABLE actions(
    id UUID NOT NULL PRIMARY KEY,
    utc_date TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    action_type TEXT NOT NULL,
    coin TEXT NOT NULL,
    action_id BYTEA NOT NULL,
    amount NUMERIC(13, 8) NOT NULL,
    investment NUMERIC(7, 2) NOT NULL DEFAULT 0.00,
    wallet TEXT NOT NULL,
    FOREIGN KEY(coin) REFERENCES coins(coin_token),
    FOREIGN KEY(wallet) REFERENCES wallets(name),
    FOREIGN KEY(action_type) REFERENCES action_type(name)
);
CREATE VIEW portfolio AS
SELECT coin,
    SUM(amount) AS amount,
    SUM(investment) AS investment,
    SUM(investment) / SUM(amount) AS min_price
FROM actions
GROUP BY coin
HAVING SUM(amount) > 0.00
ORDER BY coin;
CREATE VIEW actual_investment AS
SELECT SUM(investment)
FROM actions
WHERE action_type IN ('DEPOSIT', 'WITHDRAW');

在我的 python 代码中,我使用sqlalchemy 声明了一个动作类。到目前为止,它按预期工作,我可以读写该表。但是我还没有找到一种方法来映射投资组合之类的只读表。我实现的解决方法是在 Python 中模拟 SQL 查询(我有点不喜欢)。

这可能吗?

注意:我找到了这个帖子,但我在视图中没有主键 Is possible to mapping view with class using mapper in SqlAlchemy?

class Portfolio(Base):
    __table__ = Table(
        "portfolio",
        Base.metadata,
        Column("coin", String, primary_key=True),
        Column("amount", Float(precision=13), nullable=False),
        Column("investment", Float(precision=7), nullable=False),
    )

以上代码产生以下错误:

sqlalchemy.exc.ArgumentError: Mapper mapped class Portfolio->portfolio could not assemble any primary key columns for mapped table 'portfolio'

任何帮助或提示将不胜感激:-)

【问题讨论】:

    标签: python sqlalchemy orm


    【解决方案1】:

    我找到了一个适用于我的用例的“解决方案”。由于我知道我的视图中的“硬币”列将包含唯一值,因此我将该列重新定义为主键。我想这对于任何被分组的列都是正确的。

    我希望这个解决方案适用于遇到这篇文章的每个人:-)

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2021-01-18
      • 2016-06-06
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      相关资源
      最近更新 更多