pandas read_sql返回传递参数的查询字符串

时间:2016-03-18 15:37:08

标签: python sql pandas

import pandas as pd
q = """
     select *
     from tbl 
     where metric = %(my_metric)s
     ;
     """
params = {'my_metric':'sales'}
pd.read_sql(q, mysql_conn, params=params)

我正在使用pandas read_sql函数将参数安全地传递给我的查询字符串。我想返回最终查询字符串,替换参数以及结果。例如,返回字符串:

select *
from tbl 
where metric = 'sales'
;

有什么办法吗?

4 个答案:

答案 0 :(得分:1)

好的,在这种情况下试试这个:

import pandas as pd    
q = """
 select *
 from tbl 
 where metric = %s
 ;
 """
params = {'my_metric': 'sales'}
df = pd.read_sql(q, mysql_conn, params=[params['my_metric']])
query_string = q % params['my_metric']

答案 1 :(得分:0)

如果您使用的是psycopg2,那么您可以尝试使用mysql_conn实例创建游标,然后mogrify q

这对我有用:

import pandas as pd
q = """
     select *
     from tbl 
     where metric = %(my_metric)s
     ;
     """
params = {'my_metric':'sales'}

cur = mysql_conn.cursor()

print cur.mogrify(q, params)
pd.read_sql(q, mysql_conn, params=params)

答案 2 :(得分:0)

我认为read_sql不具备该选项,但您可以使用正则表达式重新构建查询的内容。

import re
actual_q = re.sub('%\(.*\)s',params[re.findall('%\(.*\)s',q)[0].strip('%(').strip(')s')],q)
print(actual_q)

 select *
 from tbl 
 where metric = sales
 ;

这仅适用于每个查询一个参数。如果你有更多,你可以创建一个使用re.findall找到的参数列表,并迭代它们以替换

q_params = re.findall('%\(.*\)s',q)
for param in q_params:
    actual_param = param.strip('%(').strip(')s')
    actual_q = re.sub('%\({}\)s'.format(actual_param), params[actual_param],q)
print(actual_q)

 select *
 from tbl 
 where metric = sales
 ;

答案 3 :(得分:0)

扩展并解决@tvashtar答案中的某些问题

actual_q = query_string
for param in q_params:
    actual_param = param.strip('%(').strip(')s')
    # 'param1'
    form_param = '%\({}\)s'.format(actual_param)
    # '%s\\(param1\\)s'
    value = str(params[actual_param]) if params[actual_param] else "\'\'"
    # '' if no value else the str of param1
    actual_q = re.sub(form_param, value, actual_q)
    print(actual_q)

在处理完参数列表之后,actual_q的值将替换为查询字符串