如何有效地在Python中提交多个SQL查询字符串?



我有一个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'))

最新更新