Flask写了个页面,用来查询数据库中的手机号对应的信息。
我想查询的就两种情况。
精确查询就不用说了,主要说一下两种模糊查询的情况。
第一种:号码不全的(不足11位)
在Flask中,数据库用的是SQLAlchemy类,所以没有直接写sql语句查询。用like就行了。
1 2 3
| query_string = '13606735' users = User.query.filter(User.phone.like(f'%{query_string}%')).all() print(users)
|
第二种:带*
号的
我这里是固定的格式,显示前3位和后3位,中间一串*
号。比如:136*******322
思路:
- 先把字符串切片,获取前3位和后3位;
- 再把正则表达式的查询条件regex拼出来;
- 最后在filter中用用text就行了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from sqlalchemy import text
query_string = '136*******322' if '*' in query_string: phone_prefix = query_string[:3] phone_suffix = query_string[-3:]
regex = f'^[{phone_prefix[0]}][{phone_prefix[1]}][{phone_prefix[2]}][0-9]{{5}}[{phone_suffix[0]}][{phone_suffix[1]}][{phone_suffix[2]}]$' users = User.query.filter(text("phone REGEXP :regex")).params(regex=regex).all() print(users)
|
这里对应直接用sql语句查询的话是:
select * from users where phone REGEXP "^[1][3][6][0-9]{5}[3][2][2]$"
完成一点的代码片就是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from flask import Flask, render_template, request from flask_sqlalchemy import SQLAlchemy from sqlalchemy import text
def query_test(): query_tel = '136*******322' if len(query_tel) == 11 and query_tel.isdigit(): user = User.query.filter_by(phone=query_tel).first() print(user) else: if '*' in query_tel: phone_prefix = query_tel[:3] phone_suffix = query_tel[-3:]
regex = f'^[{phone_prefix[0]}][{phone_prefix[1]}][{phone_prefix[2]}][0-9]{{5}}[{phone_suffix[0]}][{phone_suffix[1]}][{phone_suffix[2]}]$' print(regex) users = User.query.filter(text("phone REGEXP :regex")).params(regex=regex).all() else: users = User.query.filter(User.phone.like(f'%{query_tel}%')).all() print(users)
query_test()
|