2017-05-19 4 views
3

Pony ORMを使用してMySQLでビューから返されたデータを取得しようとしていますが、documentationはこれを達成するための情報を提供していませんこの時点までの任意の解決策)。ポニーORMでこれを行うことはできますか?もしそうなら、私はそれを働かせるために何をすべきですか?ここでPony ORMでSQLビューを使用する方法

は私の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)新しいエンティティを定義し、そのエンティティのテーブル名として表示名を指定します。

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) 
0:
class ResidueCountByDate(db.Entity): 
    dt = PrimaryKey(date, column='Date') 
    aluminum_count = Required(int, column='Aluminum Count') 
    pet_count = Required(int, column='PET Count') 

は、その後、あなたはビューからデータを選択するために、そのエンティティを使用することができます

デフォルトでは、列名は属性名と同じです。 Pythonの属性名にはスペースを入れることができず、通常は小文字で書かれているので、各属性に明示的にcolumnを指定しました。

それはエンティティ名と等しくない場合、明示的にテーブル名を指定することも可能です。

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 

列場合nameはPython識別子として使用できます(つまり、スペースや特殊文字は含まれません)。最終行のようにドット表記を使用して列値にアクセスできます。

+0

それは素晴らしいです!私は、データベースクラスのselectメソッドについて認識していませんでした。私は少しだけその部分を探ることができたと思う。 2番目の選択肢は私のニーズに合っています!私はあなたの助けに感謝します!どうもありがとうございました! –

関連する問題