преобразовать sql в sqlalchemy с псевдонимом, используя выбираемый подзапрос - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу найти пару: каждая зона со всеми магазинами из моей таблицы store, где связанная зона закрыта для зоны. Следующий sql запрос работает хорошо:

SELECT zone_1.id AS zone_1_id, store_1.id AS store_1_id
FROM zone as zone_1 JOIN store store_1 on store_1.zone_id != zone_1.id
WHERE ST_DWithin(zone_1.point, (SELECT zone2.point AS zone_point 
FROM zone as zone2
WHERE zone2.id = store_1.zone_id), 10)

Но когда я конвертировал его в sqlalchemy, что-то не получилось:

z1 = aliased(zone)
z2 = aliased(zone)
s1 = aliased(store)
close_store_query = z1.query(z1.id,s1.id).join(s1, z1.id != s1.zone_id ).filter(
    func.ST_DWithin(z1.point, z2.query(z2.point).filter(z2.id == s1.zone_id), 10),
)

я получил следующую ошибку:

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) subquery in FROM must have an alias

Есть ли у вас какие-либо идеи о том, почему он не работает, я не уверен, нужно ли мне использовать выбираемый подзапрос.

Команда, сгенерированная sqlalchemy:

SELECT zone_1.id AS zone_1_id, store_1.id AS store_1_id
FROM (SELECT zone_2.point AS zone_2_point 
FROM zone AS zone_2, store AS store_1 
WHERE zone_2.id = store_1.zone_id), zone AS zone_1 JOIN store AS store_1 ON zone_1.id != store_1.zone_id 
WHERE ST_DWithin(zone_1.point, (SELECT zone_2.point AS zone_2_point 
FROM zone AS zone_2 
WHERE zone_2.id = store_1.zone_id), :ST_DWithin_1)

Первый ОТ не должен быть там ..

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