2015-02-26 9 views
6

Ho una tabella utenti con first_name e una colonna last_name. Sto cercando di creare una query SQLAlchemy che eseguirà un like su una concatenazione delle due colonne, nome completo di IE. Ecco un esempioCome filtrare le colonne concesse con LIKE usando SQLAlchemy?

first_name: Bob

last_name: Smith

query = "bob smi"

Cerco interrogazione qualcosa di simile:

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

tale che una ricerca di bob smi tornerà bob smith

Grazie!

+0

Dovrebbe funzionare come l'hai scritto se aggiungi uno spazio tra 'firstName' e' lastName' – van

risposta

7

si erano vicini, ciò che è necessario è quello di costruire la seguente query in 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  | 
+-----------+------------+-----------+ 

allora sarà chiaro che è necessario un filtro con funzione di concat():

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

Questa soluzione dovrebbe funzionare su tutti i tipi di database poiché l'operatore + viene tradotto l'operatore SQL || quando viene utilizzato tra stringhe:

session.query(Person).filter((
     Person.first_name + ' ' + Person.last_name 
    ).like('{0}%'.format(query)) 
) 
Problemi correlati