2017-05-19 1 views
3

포니 ORM을 사용하여 MySQL에서 뷰에 의해 반환 된 데이터를 가져 오려고하는데, documentation은 이것을 달성하는 방법에 대한 어떠한 정보도 제공하지 않습니다. 이 순간까지 모든 해결책). 수 조 ORM이 할 수 있습니까? 그렇다면 어떻게 작동시켜야합니까?포니 ORM으로 SQL 뷰를 사용하는 방법

1) 새로운 엔티티를 정의하고 그 개체에 대한 테이블 이름으로 뷰 이름을 지정합니다 :

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

당신은 다음 중 하나를 시도 할 수 있습니다 :

을 여기

내 MySQL을보기입니다

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 애트리뷰트 이름에는 공백이 포함될 수 없으며 대개 소문자로 작성되기 때문에 각 애트리뷰트에 명시 적으로 열을 지정했습니다. 열 만약

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 

: 당신은 어떤 실체를 정의하지 않고 원시 SQL 쿼리를 작성할 수 있습니다

class ResidueCount(db.Entity): 
    _table_ = 'ResidueCountByDate' 
    ... 

2)는 엔티티 이름과 동일하지 않은 경우

이 명시 적으로 테이블 이름을 지정할 수 있습니다 이름은 파이썬 식별자로 사용할 수 있습니다 (예 : 공백이나 특수 문자를 포함하지 않음). 마지막 줄과 같이 점 표기법을 사용하여 열 값에 액세스 할 수 있습니다.

+0

놀랍습니다! 나는 Database 클래스의 select 메소드에 대해 몰랐다. 나는 그 부분을 조금 더 탐험 할 수 있다고 생각한다. 두 번째 대안은 내 필요에 맞는 것입니다! 도와 줘서 고마워! 고마워요! –

관련 문제