我有一个包含first_name
和last_name
列的用户表。我正在尝试创建一个SQLAlchemy查询,它将在两列的连接上执行类似IE的全名。这是一个例子
first_name: Bob
last_name: Smith
query = "bob smi"
我正在寻找类似的查询:
session.query(Person).filter((Person.firstName + " " + Person.lastName).like(query+'%')
搜索bob smi
将返回bob smith
谢谢!
答案 0 :(得分:8)
你很亲密,你需要的是在sql中构造以下查询:
root@localhost [inDB]> SELECT * FROM Person;
+-----------+------------+-----------+
| person_id | first_name | last_name |
+-----------+------------+-----------+
| 1 | Bob | Smith |
| 2 | John | Smith |
+-----------+------------+-----------+
2 rows in set (0.00 sec)
root@localhost [inDB]> SELECT * FROM Person WHERE CONCAT(first_name, ' ', last_name) LIKE 'Bob Sm%';
+-----------+------------+-----------+
| person_id | first_name | last_name |
+-----------+------------+-----------+
| 1 | Bob | Smith |
+-----------+------------+-----------+
然后很明显你需要一个带有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'
答案 1 :(得分:1)
此解决方案应适用于所有数据库类型,因为+
运算符在字符串之间使用时会转换为SQL ||
运算符:
session.query(Person).filter((
Person.first_name + ' ' + Person.last_name
).like('{0}%'.format(query))
)