Python迭代,在MySQL查询中将列表传递给参数

2024-04-29 02:16:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图遍历Python列表,以便在MySQL中有多个查询,但是“%s”参数包含引号,并且我的查询中只有0(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()

我也试过:

^{pr2}$

但我还是得零分。 我认为它在参数中包含了引号,因此它正在进行的查询是:

SUM(IF(Credito=""Conta Corrente Itau"", valor, 0))

编辑:(实际上,它没有将list元素传递给查询,因此它在查询:

SUM(IF(Credito="%s", valor, 0))

但我不确定。在

除此之外,它似乎工作得很好,因为我的“检查指纹”给了我预期的结果。在

已解决:

当MySQL查询中有多个参数时,我发现有一个线程回答了我的问题:添加一个聚合参数的“params”变量。在

params = (account, account)

然后在查询(""")结束后添加% (params)

用一个有效的代码更新了代码。 仍然不知道这是好的做法还是最好的方法,但它是有效的。在


Tags: 代码infordata参数ifasaccount
2条回答

决议:

当MySQL查询中有多个参数时,我发现有一个线程回答了我的问题:添加一个聚合参数的“params”变量。在

params = (account, account)

然后在查询结束后添加% (params)"""

用一个有效的代码更新了代码。仍然不知道这是好的做法还是最好的方法,但它是有效的。在

游标不允许执行多个查询。在

代替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"

您还可以轻松地从输出创建数据帧,如下所示:

^{pr2}$

请确保您的查询以";"分隔,并且不要将";"放在最后一个查询之后,否则它将失败。在

编辑

在这里,您需要从文件中的query=...语句中获取脚本_名称.sql文件。 按照这种方式编写,您需要的数据应该以(temp)表结束,这样您只需调用以下命令即可获得数据:

Select * from output_table

相关问题 更多 >