2017-05-19 18 views
3

我想獲取數據在MySQL中使用小馬ORM返回的數據,但documentation不提供任何信息如何實現這一點(以及我找不到任何解決方案,直到這一刻)。小馬ORM可以做到這一點嗎?如果是這樣,我該怎麼做才能使它工作?如何使用SQL查看與小馬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) 
+0

據我所知,您可以從中選擇看起來好像是一張桌子,你是否試過這樣做? – FMashiro

回答

3

你可以嘗試以下之一:

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標識符(即它不包含空格或特殊字符),您可以使用點符號訪問列值,如最後一行

+0

太棒了!我沒有意識到Database類中的select方法。我想我可以多探索一點。第二種選擇適合我的需求!我感謝您的幫助!非常感謝你! –