如何使用SQLAlchemy使用LIKE过滤concat列?

时间:2015-02-26 17:08:03

标签: python mysql sqlalchemy

我有一个包含first_namelast_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

谢谢!

2 个答案:

答案 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))
)