如何使用 Pony ORM 的 SQL 视图
How to use a SQL View with Pony ORM
我正在尝试使用 Pony ORM 获取由 MySQL 中的视图返回的数据,但是 documentation 没有提供有关如何实现此目的的任何信息(好吧,我不能找到任何解决方案,直到这一刻)。 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)
您可以尝试以下方法之一:
1) 定义一个新实体并将视图名称指定为该实体的 table 名称:
class ResidueCountByDate(db.Entity):
dt = PrimaryKey(date, column='Date')
aluminum_count = Required(int, column='Aluminum Count')
pet_count = Required(int, column='PET Count')
之后,您可以使用该实体 select 来自视图的数据:
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中属性名不能包含空格,而且通常写成小写。
可以显式指定 table 名称,如果它不等于实体名称:
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 标识符(即它不包含空格或特殊字符),您可以像最后一行那样使用点符号访问列值
我正在尝试使用 Pony ORM 获取由 MySQL 中的视图返回的数据,但是 documentation 没有提供有关如何实现此目的的任何信息(好吧,我不能找到任何解决方案,直到这一刻)。 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)
您可以尝试以下方法之一:
1) 定义一个新实体并将视图名称指定为该实体的 table 名称:
class ResidueCountByDate(db.Entity):
dt = PrimaryKey(date, column='Date')
aluminum_count = Required(int, column='Aluminum Count')
pet_count = Required(int, column='PET Count')
之后,您可以使用该实体 select 来自视图的数据:
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中属性名不能包含空格,而且通常写成小写。
可以显式指定 table 名称,如果它不等于实体名称:
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 标识符(即它不包含空格或特殊字符),您可以像最后一行那样使用点符号访问列值