Некоторое время назад выяснилось, что в моем случае эффективнее писать RAW-запросы в Django, нежели использовать ORM:
Как в Django через ORM сделать SQL-запрос с INNER JOIN?...
Теперь столкнулся с тем, что относительно простой вопрос вообще не хочет исполнятся. Запрос примерно таков:
SELECT TAB1.id, TAB2.id, TAB2.something, TABLINK1TO2.quantity
FROM TAB2
INNER JOIN (TAB1
INNER JOIN TABLINK1TO2
ON TAB1.id = TABLINK1TO2.link4tab1_id)
ON TAB2.id = TABLINK1TO2.link4tab2_id
WHERE TAB1.id=1
GROUP BY TAB1.id, TAB2.id, TAB2.something, TABLINK1TO2.quantity;
raw-запрос возвращает:
<RawQuerySet: 'тут собственно посланный запрос'>
и обращение к его элементам вызывает ошибки и ругань на отсутствие полей в базе:
no such column: TAB1.id
Собственно исключение полей из запроса приводит к ругани на следующее поле... когда их не остается, то ругается на поля внутри INNER JOIN... В общем, не работает.
При этом, буквально упростив вопрос всего на один INNER JOIN:
SELECT TAB2.id, TAB2.something, TABLINK1TO2.quantity
FROM TAB2
INNER JOIN TABLINK1TO2
ON TAB2.id = TABLINK1TO2.link4tab2_id
WHERE TABLINK1TO2.link4tab1_id=1
GROUP BY TAB2.id, TAB2.something, TABLINK1TO2.quantity;
И все начинает исправно фурыкать.
К сожалению мне нужен именно первый запрос, т.к. в TAB1 есть еще поля которые нужно получить (для простоты и читабельности они опущены). И такое впечатление, что ошибка именно на стороне SQLite3. Такое может быть? Или просто руки кривые?
Было бы отлично, если бы кто-то научил меня такие запросы строить через ORM, т.к. в этих таблицах немного данных и скорость не принципиальна. К сожалению в мануалах нет кейсов извлечения данных сразу из трех таблиц (двух основных и одной ManyToManyField, но в которой есть еще дополнительные атрибуты.
P.S. К сожалению проверить исполнение запроса через консоль SQLite3 не представляется возможным. Консоль SQLite3 не воспринимает работу Ctrl-Ins + Shiht-Ins (Ctrl-X + Ctrl-V), а набрать столь заковыристый SQL-запрос без ошибок нереально. Дело в том, что в реальном проекте таблицы и поля названы длинными и сложными именами, да еще к именам таблиц сам DJANGO добавил префикс из имени проекта... Только в конструкции
FROM ... INNER JOIN (... INNER JOIN ... ON ....) ON ... что-то под 300 символов получается. Так что лучше не пытаться! :(
P.P.S. Совет пересесть на нормальную СУБД, вроде postgres. не подходит по причине того, что приходится кодить то на одной машине, то на другой. Перекинуть файл-базу SQLite3 через какой-нить dropbox проще простого и она одинаково подхватывается и из Windows и под Ubuntu...