如何使用SQL视图和Pony ORM

4
我正在尝试使用Pony ORM获取MySQL视图返回的数据,但是文档没有提供任何关于如何实现此操作的信息(直到目前为止,我都找不到任何解决方案)。 Pony ORM能够实现这个吗?如果可以,我应该怎么做才能使其工作?
这是我的MySQL视图:
CREATE 
ALGORITHM = UNDEFINED 
DEFINER = `admin`@`%` 
SQL SECURITY DEFINER
VIEW `ResidueCountByDate` AS
SELECT 
    CAST(`ph`.`DATE` AS DATE) AS `Date`,
    COUNT(`art`.`RESIDUE_TYPE_ID`) AS `Aluminum Count`,
    COUNT(`prt`.`RESIDUE_TYPE_ID`) AS `PET Count`
FROM
    ((((`TBL_PROCESS_HISTORY` `ph`
    JOIN `TBL_RESIDUE` `pr` ON ((`ph`.`RESIDUE_ID` = `pr`.`RESIDUE_ID`)))
    LEFT JOIN `TBL_RESIDUE_TYPE` `prt` ON (((`pr`.`RESIDUE_TYPE_ID` = `prt`.`RESIDUE_TYPE_ID`)
        AND (`prt`.`DESCRIPTION` = 'PET'))))
    JOIN `TBL_RESIDUE` `ar` ON ((`ph`.`RESIDUE_ID` = `ar`.`RESIDUE_ID`)))
    LEFT JOIN `TBL_RESIDUE_TYPE` `art` ON (((`ar`.`RESIDUE_TYPE_ID` = `art`.`RESIDUE_TYPE_ID`)
        AND (`art`.`DESCRIPTION` = 'ALUMINUM'))))
GROUP BY CAST(`ph`.`DATE` AS DATE)
ORDER BY CAST(`ph`.`DATE` AS DATE)

据我所知,您可以像选择表格一样从视图中进行选择,您尝试过这样做吗? - Florian Humblot
1个回答

4
您可以尝试以下方法之一:
1)定义一个新实体,并将视图名称指定为该实体的表名:
class ResidueCountByDate(db.Entity):
    dt = PrimaryKey(date, column='Date')
    aluminum_count = Required(int, column='Aluminum Count')
    pet_count = Required(int, column='PET Count')

之后,您可以使用该实体从视图中选择数据:

with db_session:
    start_date = date(2017, 1, 1)
    query = select(rc for rc in ResidueCountByDate if rc.date >= start_date)
    for rc in query:
        print(rc.date, rc.aluminum_count, rc.pet_count)

默认情况下,列名等于属性名。我为每个属性显式指定了列,因为在Python中,属性名不能包含空格并且通常以小写字母书写。
如果表名不等于实体名称,则可以显式指定表名:
class ResidueCount(db.Entity):
    _table_ = 'ResidueCountByDate'
    ...

2) 你可以写原始的SQL查询而不需要定义任何实体:

with db_session:
    start_date = date(2017, 1, 1)
    rows = db.select('''
        SELECT `Date` AS dt, `Aluminum Count` AS ac, `PET Count` AS pc
        FROM `ResidueCountByDate`
        WHERE `Date` >= $start_date
    ''')
    for row in rows:
        print(row[0], row[1], row[2])
        print(row.dt, row.ac, row.pc)  # the same as previous row

如果列名可以作为Python标识符(即不包含空格或特殊字符),则可以使用点表示法访问列值,如最后一行所示。

太棒了!我之前不知道 Database 类中有 select 方法。我想我可以更深入地探索这一部分。第二个选择符合我的需求!感谢你的帮助!非常感谢! - Athus Vieira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接