我试图遍历Python列表,在MySQL中有多个查询,但是"%s"参数包括引号,我在查询中只得到0(当我知道我应该得到一个不同的数字时)。
代码:
def export_data():
infos = [
'Conta Corrente Itau',
'Cartao Itau Master',
'Cartao Itau VISA',
'Carteira'
]
chart_of_accounts = list(infos)
for account in chart_of_accounts:
cnx = mariadb.connect(user='root', password='', database='base_completa')
cursor = cnx.cursor()
params = (account, account)
query = """
SELECT Y, M,(@total := @total + Fluxo) AS ValorTotal
FROM (
SELECT year(data) AS Y, month(data) AS M,
(
SUM(IF(Credito="%s", valor, 0))-
SUM(IF(Debito="%s", valor, 0))
) AS Fluxo
FROM ledger
GROUP BY YEAR(DATA), MONTH(DATA)
) AS T,
(SELECT @total:=0) AS n;
""" % (params)
cursor.execute(query)
rows = cursor.fetchall()
desc = cursor.description
lista = [dict(itertools.izip([col[0] for col in desc], row))
for row in rows]
cnx.commit()
print account
print json.dumps(lista)
return lista
results = export_data()
我也尝试过:
cursor.execute(query, (chart_of_accounts[account] for account in chart_of_accounts))
但我仍然是零。 我认为它包含参数中的引号,因此它所做的查询是:
SUM(IF(Credito=""Conta Corrente Itau"", valor, 0))
编辑:(实际上,它没有将list元素传递给查询,因此它正在查询:
SUM(IF(Credito="%s", valor, 0))
但我不确定。
除此之外似乎工作正常,因为我的"检查打印"给了我预期的结果。
解决:
当在MySQL查询中有多个参数时,我发现1个线程回答了我的问题:添加一个" params"聚合参数的变量。
params = (account, account)
然后在查询% (params)
(""")
使用正常运行的代码更新了代码。 仍然不知道这是好的做法还是最好的做法,但它确实有效。
答案 0 :(得分:1)
光标不允许执行多个查询。
而不是cursor = cnx.cursor()
试试这个:
with open(file_location+'\\' + 'file_name' +'.sql','r') as inserts:
sqlScript = inserts.read()
for statement in sqlScript.split(';'):
with cnx.cursor() as cur:
cur.execute(statement)
query="Select * from output_table"
您还可以从输出中轻松创建DataFrame,如下所示:
df=pd.read_sql_query(query, cnx)
确保您的查询由";"
分隔,并且在最后一次查询后不要放置";"
,否则它将失败。
- 编辑 -
在这里,您需要从file_name.sql文件中的query=...
语句中获取脚本。
编写它的方式,您需要的数据最终应该放在(临时)表中,以便调用数据所需的全部内容:
Select * from output_table
答案 1 :(得分:0)
解决:
当在MySQL查询中有多个参数时,我发现1个线程回答了我的问题:添加一个" params"聚合参数的变量。
params = (account, account)
然后在查询结束后添加% (params)
("""
)
使用正常运行的代码更新了代码。仍然不知道这是好的做法还是最好的做法,但它确实有效。