Построение запросов, связанных с помощью OR

#python #ponyorm

#python #ponyorm

Вопрос:

Я пытаюсь запросить таблицу, используя цепочку операторов OR. На практике я хотел бы выполнить запрос типа:

 ... 
 WHERE A.name = ? or A.name = ? or A.name = ? ... 
  

НО возможные значения хранятся в списке, я не знаю, как долго это. Так что я мог бы в конечном итоге написать запрос Pony, подобный этому:

 # names is my list, it contains str
select(tag for tag in Tag if any(tag.name == name for name in names)) 
  

Это не работает, Пони жалуется, что я пытаюсь выполнить итерацию по чему-то, кроме объекта или запроса (правильно!). Я мог бы попробовать поиграть с методом filter и постепенно создавать запрос, например:

 names = ["first", "second", "third"] 
query = select(tag for tag in Tag) 
for name in names: 
    query = query.filter(tag for tag in query if tag.name == name) 
  

Но это не работает, так как это приводит к цепочке операторов AND , а не операторов OR , и, похоже, нет способа создавать запросы OR .

В этом упрощенном примере, конечно, я мог бы использовать in ключевое слово Python, но это не сработало бы при более сложном запросе, например:

 select(tag for tag in Tag if any(tag.name.startswith(name) for name in names)) 
  

Есть ли что-то очевидное (или менее очевидное) Я пропустил?

Спасибо!

Комментарии:

1. возможно , метод select_by_sql поможет вам

2. Это могло бы. Но я бы хотел использовать Python всякий раз, когда это возможно. Идея использования ORM для меня заключается в том, чтобы попытаться избежать ужасной работы с SQL, и я знаю, что многие ORM могут это сделать.

3. Не могли бы вы просто сделать if tag.name in names ?