2010-11-06 11 views
20

Czy można użyć wyrażenia regularnego w sposób podobny do session.query(MyObject).filter_by(REGEX)?Wyrażenia regularne w zapytaniach SQLalchemy?

Jeśli nie, w jaki sposób mogę użyć sqlAlchemy do pobrania rekordów, których początkowa wartość PK zaczyna się od określonej wartości (np. Wszystkie te, których miasto zaczyna się od "SA")? Dzięki.

+1

W przypadku korzystania z Oracle, będziemy chcieli wykorzystać tę odpowiedź http://stackoverflow.com/a/14750641/269834 –

Odpowiedz

23

Myślę, że mam go:

session.query(Object).filter(Object.column.op('regexp')(REGEX)) 
+8

Ta odpowiedź będzie działać tylko w MySQL, który używa 'REGEXP' jako operatora porównania. Będziesz musiał zmienić go w innych bazach danych i będzie działał tylko tak, jeśli baza danych ma operatora porównania wyrażeń regularnych (w przeciwieństwie do, na przykład, funkcji). W PostgreSQL możesz użyć 'op ('~')'. –

3

[OŚWIADCZENIE: nie regex]

ja odpowiadając na pytanie „Jak mogę użyć sqlalchemy aby pobrać rekordy, które mają PK varchar rozpoczynającej się od określonej wartości”, ponieważ w tym prostym przypadku użyć LIKE prawdopodobnie jest zarówno tańszy, jak i bardziej przenośny (zapytanie o wyrażenia regularne wydaje się być manifestacją the XY Problem).

W SQLAlquemy (pożyczanie od Alex):

session.query(Object).filter(Object.column.like('something%')) 

W SqlSoup używam:

db.table.filter(db.table.column.like('something%')) 
+2

Dlaczego downvote? Wyrażenie regularne jest wyraźnie przesadzone, aby przetestować ciąg rozpoczynający się od "czegoś". Ponadto, nie każda baza danych ma natywne wsparcie dla regex, ale każda baza danych SQL obsługuje "podobne" instrukcje - operacje po stronie serwera są zawsze lepsze. –

+0

Bo "jak" są o wiele mniej skuteczne niż regexp ... – Sylvestre

+1

@Sylvestre ... i znacznie droższe i mniej przenośne. –

3

Dla przypomnienia, można zrób zasadniczo taką samą składnię jak odpowiedź Paulo Scardine w SQLAlchemy;

session.query(Object).filter(Object.column.like('something%')) 
+0

Dlaczego upadek? * Dosłownie * wszystko, co robię, to tłumaczenie SQLAlchemy, aby opisać inną odpowiedź. Nie twierdzę, że jest lepiej, a nawet, że odpowiedź, którą tłumaczę, jest najlepszym rozwiązaniem. Jeśli coś jest nie tak, komentarz i poprawne (a może tak być), ale nie arbitralnie donwvote! – Alex

+1

To jest pytanie "jak", a nie "wyrażeń regularnych", o które pytano w pytaniu. –

Powiązane problemy