2011-10-17 2 views
0

여러 테이블에서 원시 SQL을 수행해야합니다. 그런 다음 결과 세트를 렌더링합니다. 내가 뭐하는 거지 여러 테이블의django/python : 여러 테이블이있는 원시 SQL

sql = "select * from my_table" 
results = my_table.objects.raw(sql) 

을 : 하나 개의 테이블을 위해 내가 할 것,

sql = "select * from my_table, my_other_table where ...." 
results = big_model.objects.raw(sql) 

을하지만 난 정말 모든 필드를 포함하는 테이블/모델/클래스 big_model를 작성해야 할 것을 I 필요할지도 몰라? 나는이 "테이블"에 실제로 어떤 데이터도 저장하지 않을 것입니다.

추가 :

테이블 my_users가 있습니다. 나는 테이블 my_listings을 가지고있다. 이것들은 Models.py에 정의되어 있습니다. 테이블 my_listings에는 my_users에 대한 외래 키가 있으며 이는 누가 목록을 작성했는지 나타냅니다.

는 SQL은

"select user_name, listing_text from my_listings, my_users where my_users.id = my_listings.my_user_id". 

내가이 SQL 내가 장고에 내 페이지를 렌더링하는 데 사용할 수있는 결과 세트를 생성 할 수 있습니다.

질문 : 나는 user_name 및 listing_text 필드가 포함 된 모델을 만들어야합니까? 아니면 원시 SQL (select, from, where)을 사용하는 더 좋은 방법이 있습니까? 물론, 실제 쿼리는이 예제보다 복잡합니다. (models.py에서 정의한 모델은 데이터베이스의 실제 테이블이되고 따라서 모델/테이블 용어의 사용은 미안합니다. 미안합니다.) 파이썬 테이블 참조 만 발견했기 때문에 raw SQL을 사용합니다. 간단한 데이터 모델로 작업하십시오.

+0

여기에서 성취하고자하는 것은 분명하지 않습니다. 아마도 모델에 대한 세부 정보를 표시하고이 쿼리가 의도 한 내용이 도움이 될 것입니다. –

+0

테이블이 외래 키로 결합되는 둘 이상의 테이블에서 선택하려고합니다. 실제 쿼리를 작성하는 데 도움이 필요하지 않습니다. 죄송합니다, 왜 명확하지 않은지 잘 모르겠습니다. ( – user984003

+0

당신이 쿼리에 도움이 필요해 보입니다. 왜 장고에서 원시 SQL이 필요하다고 생각하는지 모르겠습니다. 질문을 작성하는 데 도움이된다면 질문하는 것에 대한 아이디어가 적어집니다. –

답변

1
  1. 이것은 작동합니다. Dennis Baker의 의견 :

모든 필드가있는 모델은 필요하지 않지만 첫 번째 모델과 필드가 필요합니다. 고유 한 이름을 가진 필드를 가질 필요가있다. 필자가 알고있는 한 "tablename.field as fieldname"을 사용하여 모든 고유 한 필드가 있는지 확인해야한다. 나는 5+ 테이블을 가진 상당히 복잡한 쿼리를이 방법과 항상 수행했다. -

2. 다른 해결책은 커서를 사용하는 것입니다. 그러나 튜플 목록에서 사전 목록으로 커서를 변경해야합니다. 확실한 방법이 있다고 확신합니다. iterators를 사용하지만이 함수는 작동합니다. 원시 sql 쿼리 인 문자열을 사용하여 템플릿에서 렌더링되고 사용될 수있는 목록.

from django.db import connection, transaction 

def sql_select(sql): 
    cursor = connection.cursor() 
    cursor.execute(sql) 
    results = cursor.fetchall() 
    list = [] 
    i = 0 
    for row in results: 
     dict = {} 
     field = 0 
     while True: 
      try: 
       dict[cursor.description[field][0]] = str(results[i][field]) 
       field = field +1 
      except IndexError as e: 
       break 
     i = i + 1 
     list.append(dict) 
    return list 
+0

커서를 사용할 때 각 행을 모델에 어떻게 매핑합니까? 나는 Django에 완전히 새로운 사람이다. django 서버가 모델 인스턴스를 캐시합니까? 기본적으로 데이터베이스에서 데이터를 복제합니까? 프로덕션 환경에서 API를 실행하면 캐시 된 모델 데이터에서 데이터가 제공되거나 매번 실행되는 커서 객체입니까? 고맙습니다! –

0

원시 SQL에서 반환하려는 필드가 포함 된 모델은 필요하지 않습니다. 원시 SQL에서 반환하려는 필드가 실제로있는 모델을 사용하면 원시 SQL 출력을이 모델에 매핑 할 수 있습니다. 그렇지 않으면 cursors을 사용하여 모델을 모두 이동할 수 있습니다.

+0

https://docs.djangoproject.com/en/dev/topics/db/sql/의 문서에서 "raw()는 쿼리의 필드를 모델의 필드에 자동 매핑합니다."라고 말합니다. 이는 적어도 쿼리의 필드를 포함하는 모델을 가져야 함을 나타냅니다. 쿼리는 두 테이블의 필드를 생성하므로 해당 필드가 포함 된 세 번째 모델이 있어야합니까? 이것이 내가 피하고자하는 바입니다. – user984003

+0

문제를 이해하는 데 다소 시간이 걸렸습니다 :) 이것은 아주 좋은 질문이며, 장고는이 분야에서별로 부족하다고 생각합니다. 나는 내 대답을 바꾸었다. – akonsu

+0

모든 필드가있는 모델을 가질 필요는 없습니다. 첫 번째 모델과 필드 만 있으면됩니다. 고유 한 이름으로 필드를 가져야하며 모든 고유 필드가 있는지 확인하기 위해 "tablename.field as fieldname"을 사용해야합니다. 이런 식으로 5+ 테이블을 사용하여 상당히 복잡한 쿼리를 수행했으며 항상 단일 모델로 되돌려 놓습니다. –

관련 문제