Django / Python: сырой SQL с несколькими таблицами - PullRequest
2 голосов
/ 17 октября 2011

Мне нужно выполнить сырой 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, который содержитвсе поля, которые мне могут понадобиться?Я никогда не буду хранить данные в этой «таблице».

ДОБАВЛЕНО:

У меня есть таблица 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 генерировал набор результатов, который я могу использовать для рендеринга моей страницы в django.

Вопрос в том, нужно ли создавать модель, содержащую поля user_name и перечисление_text?Или есть какой-то лучший способ, который все еще использует сырой SQL (выберите, откуда, где)?Конечно, мои реальные запросы сложнее, чем этот пример.(Модели, которые я определяю в models.py, становятся фактическими таблицами в базе данных, поэтому используется термин модель / таблица. Не знаю, как еще ссылаться на них, извините.) Я использую raw sql, потому что обнаружил, что ссылки на таблицы pythonработа с простыми моделями данных.

Ответы [ 2 ]

2 голосов
/ 19 октября 2011
  1. Это работает. Не знаю, почему этого не было раньше :( Из комментария Денниса Бейкера:

Вам НЕ нужно иметь модель со всеми полями в ней, вам просто нужна первая модель и поля из нее. Вам нужно иметь поля с уникальными именами, и, насколько я знаю, вы должны использовать «tablename.field as fieldname», чтобы убедиться, что у вас есть все уникальные поля. Таким образом, я выполнил несколько довольно сложных запросов с 5+ таблицами и всегда привязывал их к одной модели. -

2. Другое решение заключается в использовании курсора. Однако курсор должен быть изменен из списка кортежей в список словарей. Я уверен, что есть более чистые способы использования итераторов, но эта функция работает. Он принимает строку, являющуюся необработанным 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 голосов
/ 17 октября 2011

вам не нужна модель, которая включает в себя поля, которые вы хотите вернуть из вашего необработанного sql.Если у вас есть модель, которая на самом деле имеет поля, которые вы хотите вернуть из вашего необработанного sql, то вы можете сопоставить исходный вывод sql с этой моделью, в противном случае вы можете использовать курсоры для обхода моделей в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...