2017-05-15 10 views
2

파이썬에서 SQLObject ORM을 사용하고 있는데, 같은 방법으로 행 객체의 생성자를 반복 할 수 있기를 원하지만 Table.select(...)이 메서드 호출을 통해 얻을 수있는 것은 너무 제한적입니다. 심지어 filter()을 사용합니다. 내가 할 수있는 거기에서사용자 정의 SQLObject Select 호출을 통해 생성기를 가져올 수 있습니까?

columns = [TableB.q.column_x, TableA.q.id] + 
    [getattr(TableA.q, col.name) for col in TableA.sqlmeta.columnList] 
inner_join = sqlbuilder.INNERJOINOn(
    table1=TableA, 
    table2=TableB, 
    on_condition=(TableA.column_y==TableB.column_z), 
) 
select = sqlbuilder.sqlbuilder.Select(items=columns, join=inner_join) 

:이 정확한 쿼리를 얻을 수 SQLBuilder을 사용하는 방법을 알고

SELECT TableB.column_x, TableA.* 
FROM TableA 
INNER JOIN TableB 
ON TableA.column_y = TableB.column_z; 

:이 방식으로 SQL 쿼리에서 얻을 것처럼

나는 같은 싶어 이 쿼리 실행 :

conn = TableA._connection 
rows = conn.queryAll(conn.sqlrepr(select)) 

을하지만이 튜플의 목록을 반환, 하지 상응하는 발전기는 Table.select(...).filter(...)

이것은 "restore_defaults는"엔드 포인트, 내가 되돌려 야의 일부입니다 (기본 및 기본) TableA의 행을 수행하여 얻을 것 나는 어떤 볼 필요로 기본 행은 여전히 ​​존재하며 사용자가 작성한 추가 사용자 정의 행을 덮어 쓰거나 삭제하지 않고 모든 기본 행을 TableA에 삽입하기 전에 행을 삭제합니다. 즉, 이것은 특정 요구 사항이며 진정으로 위의 SQL 쿼리에서 증강 된 테이블을 사용해야 할 필요가 있습니다.

반환 된 튜플을 사용하여 (심지어 임시 임시 표기를 사용하여) 이러한 검사를 수행하고 사전을 업데이트 할 수 있다는 것을 알고 있습니다. 그러나 SQLObject에서 직접 상호 작용을 얻는 더 좋은 방법은 보통 select() 요구?

는 (우리는 파이썬 2.4로 제한하고 있지만 그 차이 많이하게 생각하지 않는다) 한 번에 여러 테이블을 조회 할 수 있습니다 (클래스 SQLObject의 상속)

+1

Django 모델에서 "주석"기능과 같은 것을 찾고 있지만 SQLObject에 이러한 기능이 있다고 생각하지 않습니다. 따라서 많은 테이블의 데이터를 원하면 튜플 만 선택할 수 있습니다. –

답변

2
  1. 높은 수준의 API를 (조인)하지만 결과는 항상 SQLObject 인스턴스 목록이므로 한 클래스의 특성 만 즉시 사용할 수 있습니다. 이것은 explained in the FAQ입니다. One-to-Many or Many-to-Many Relationships을 선언하고 다른 테이블의 속성에 액세스 할 수 있습니다. SQLObject는 행을 가져 와서 SQLObject 인스턴스로 자동 변환합니다.

  2. 수정 : SQLObject.select()는 생성자를 반환하지 않으므로 iterator에서 Iteration 클래스의 인스턴스를 반환합니다. 더 많은 것 precise SQLObject.select()는 iterated가 끝나면 next() 메서드를 호출 할 때 iterator 클래스의 인스턴스를 생성하고 iterator 클래스의 인스턴스를 생성하고 iterator 인 결과를 가져 와서 다시 iterated 클래스로 전달하는 SelectResults 클래스의 인스턴스를 생성합니다. 사용자.

  3. 또한 반복은 SelectResults에서만 작동합니다. SQLBuilder의 쿼리에서는 작동하지 않습니다.