我有一个python函数,它接受一个人的列表(名字、姓氏和出生日期存储在字典中),循环遍历这个列表,逐个人查询数据库,并返回一个包含所找到结果的列表。
因此,例如,如果用户想要使用列表[{'name': 'Alice'}, {'name': 'Bob'}, {'name': 'Charlie'}]
查询3个人,该函数将查询数据库3次,每次获得一个潜在匹配列表,该列表被放入另一个列表中。它可以返回一个包含3个列表的列表,每个列表包含Alice、Bob和Charlie的匹配结果。函数如下所示:
query_string = "SELECT * FROM some_db"
def improved_batch_client_check(user_requests, db_connection):
responses = []
for one_request in user_requests:
first_name = one_request.get('FirstName')
last_name = one_request.get('LastName')
dob = one_request.get('BirthDate')
query_string_end = " WHERE db.NAME LIKE '%{}%' AND db.NAME LIKE '%{}%'".format(first_name, last_name)
if dob is None:
pass
else:
query_string_end += " AND db.DOB = '{}'".format(str(dob))
df_candidates = pandas.read_sql(query_string + query_string_end, db_connection)
responses.append(df_candidates.to_dict('records'))
return jsonify(responses)
我想做的是提高效率,通过以某种方式提交一组不同的查询来调用函数pandas.read_sql()
,这些查询以类似于下面使用的方式返回数据帧。在Python中最简单的方法是什么?
为了使它成为一个查询,我将创建一个or的查询,即-
select * from table where (request1) or (request2) ...
每个request
的形式为if dob未给出或-
db.NAME LIKE '%{}%' AND db.NAME LIKE '%{}%'".format(first_name, last_name)
,如果dob是给定的-
db.NAME LIKE '%{}%' AND db.NAME LIKE '%{}%' AND db.DOB = '{}'".format(first_name, last_name, str(dob))
把它们放在一起-
def improved_batch_client_check(user_requests, db_connection):
requests = []
for one_request in user_requests:
first_name = one_request.get('FirstName')
last_name = one_request.get('LastName')
dob = one_request.get('BirthDate')
curr_request = "db.NAME LIKE '%{}%' AND db.NAME LIKE '%{}%'".format(first_name, last_name)
if dob is not None:
curr_request += " AND db.DOB = '{}'".format(str(dob))
requests.append(curr_request)
query_string = "SELECT * FROM some_db WHERE " + 'or '.join([f'({x})' for x in requests])
df = pandas.read_sql(query_string, db_connection)
return jsonify (df.to_dict('records'))