2015-02-26 13 views
6

Mam tabelę użytkowników z kolumną first_name i last_name. Próbuję utworzyć kwerendę SQLAlchemy, która będzie wykonywać podobnie na concatationation dwóch kolumn, IE pełna nazwa. Oto przykładJak filtrować kolumny ze słowem LIKE za pomocą SQLAlchemy?

first_name: Bob

last_name: Smith

query = "bob smi"

szukam czegoś podobnego zapytania:

session.query(Person).filter((Person.firstName + " " + Person.lastName).like(query+'%')

taka, że ​​poszukiwanie bob smi powróci bob smith

Dzięki!

+0

Powinno działać tak, jak to napisałeś, jeśli dodasz spację między 'firstName' a' lastName' – van

Odpowiedz

7

byłeś blisko, co potrzebne jest, aby skonstruować następujące zapytanie w sqla:

[email protected] [inDB]> SELECT * FROM Person; 
+-----------+------------+-----------+ 
| person_id | first_name | last_name | 
+-----------+------------+-----------+ 
|   1 | Bob  | Smith  | 
|   2 | John  | Smith  | 
+-----------+------------+-----------+ 
2 rows in set (0.00 sec) 

[email protected] [inDB]> SELECT * FROM Person WHERE CONCAT(first_name, ' ', last_name) LIKE 'Bob Sm%'; 
+-----------+------------+-----------+ 
| person_id | first_name | last_name | 
+-----------+------------+-----------+ 
|   1 | Bob  | Smith  | 
+-----------+------------+-----------+ 

to stanie się jasne, że potrzebny jest filtr z concat funkcji():

from sqlalchemy import func 
res = session.query(Person).filter(func.concat(Person.first_name, ' ', Person.last_name).like('Bob Sm%')).all() 
len(res) # is 1 
res, = res 
print res.first_name, res.last_name # 'Bob Smith' 
0

To rozwiązanie powinno działać we wszystkich typach baz danych, ponieważ operator + jest tłumaczony jako operator SQL ||, gdy używany jest między łańcuchami:

session.query(Person).filter((
     Person.first_name + ' ' + Person.last_name 
    ).like('{0}%'.format(query)) 
) 
Powiązane problemy