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'
;
有什么办法吗?
答案 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
的值将替换为查询字符串