Sqlalchemy дублирует предложение WHERE в FROM - PullRequest
0 голосов
/ 04 июня 2019

Я написал необработанный запрос в psql, и он отлично работает, но когда я написал это в sqlalchemy, мое предложение WHERE дублировалось в предложении FROM.

select id from T1 where arr && array(select l.id from T1 as l where l.box && box '((0,0),(50,50))');

В этом запросе я получаю все идентификаторы из T1, где массив с целыми числами пересекается с результатами из подзапроса.

class T1():
    arr = Column(ARRAY(Integer))
    ...

class T2():
    box = Column(Box)  # my geometry type
    ...

1 версия:

layers_q = select([T2.id]).where(T2.box.op('&&')(box))  # try find all T2 intersects with box
chunks = select([T1.id]).where(T1.arr.overlap(layers_q))  # try find all T1.id where T1.arr overlap with result from first query 


SELECT T1.id 
FROM T1 
WHERE T1.arr && (SELECT T2.id 
FROM T2 
WHERE T2.box && %(box_1)s)

Это у меня ошибка PG о приведении типа. Я понимаю это.

2 версия:

layers_q = select([T2.id]).where(T2.box.op('&&')(box))
chunks = select([T1.id]).where(T1.arr.overlap(func.array(layers_q)))

Я добавил func.array () для приведения к массиву, но результат неверный:

SELECT T1.id 
FROM T1, (SELECT T2.id AS id 
FROM T2 
WHERE T2.box && %(box_1)s) 
WHERE T1.arr && array((SELECT T2.id 
FROM T2 
WHERE T2.box && %(box_1)s))

Там вы можете увидеть, что у меня есть дубликат в предложении FROM. Как это правильно?

1 Ответ

1 голос
/ 04 июня 2019

Я найду решение!

func.array(select([T2.id]).where(T2.box.op('&&')(box)).as_scalar())

После добавления as_scalar () все будет хорошо, потому что в моем выборе все идентификаторы должны быть в одном массиве.

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