在python中调用mysql存储过程并将结果写入csv文件

Posted

技术标签:

【中文标题】在python中调用mysql存储过程并将结果写入csv文件【英文标题】:Call mysql stored procedure in python and write the result into a csv file 【发布时间】:2018-04-07 07:41:26 【问题描述】:

我是 python 新手,我试图在 python 中定义一个函数,该函数使用 mysql.connector 在 python 中调用存储过程并将结果写入 csv 文件。 我已经定义了一个函数来调用存储过程并打印结果。但无法弄清楚如何将我的结果写入 csv 文件而不是打印。尝试了一些在网上找到的方法,但没有带我去任何地方

到目前为止,我的代码是:

def call_accessionsByaffliction():
    try:
        conn = mysql.connector.connect( host="localhost", user="root", 
password="1232580", database="db")
        cur = conn.cursor()
        cur.callproc('AccessionsBycauseOfAffliction_year')
        for result in cur.stored_results():
            print(result.fetchall())
    except Error as e:
        print(e)
    finally:
        cur.close()
        conn.close() 

if __name__ == '__main__':
    call_accessionsByaffliction()

有什么帮助吗?非常感谢

【问题讨论】:

如果您要写入 CSV,请使用标准的 csv 模块。 【参考方案1】:
import csv

def cs_writer(string_chunk):
    # define desired output file name      
    file_name = "output.csv"
    try:
        #open file in write mode and hold object 
        out_file = open(file_name, "wt")

        # create csv write object
        writer = csv.writer(out_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
        for line in string_chunk:
            writer.writerow(line)
    except Exception as e:
        print(e)
    finally:
        # close file
        out_file.close()

def call_accessionsByaffliction():
    try:
        conn = mysql.connector.connect( host="localhost", user="root", password="1232580", database="db")
        cur = conn.cursor()

        # execute stored procedure
        cur.callproc('AccessionsBycauseOfAffliction_year')

        # fetch all results or use fetchone()
        for res in cur.stored_results():
            result = res.fetchall()

        print(result)
        return result
    except Error as e:
        print(e)
    finally:
        cur.close()
        conn.close() 

if __name__ == '__main__':
    cs_writer(call_accessionsByaffliction())

我希望这能回答你的问题。

【讨论】:

这是我正在寻找的代码。但我仍然收到一条错误消息:没有要从中获取的结果集。回溯(最近一次调用最后):文件“”,第 2 行,在 call_accessionsByaffliction() 文件“”,第 42 行,在 call_accessionsByaffliction 结果中的行:UnboundLocalError:局部变量分配前引用的“结果”。有什么帮助解决这个问题吗?想不通 @Dusha.9 我对代码做了一些更改,你可以再试一次吗? 我仍然收到一条错误消息:Traceback(最近一次调用最后一次):文件“”,第 2 行,在 call_accessionsByaffliction() 文件“ ",第 25 行,在 call_accessionsByaffliction writer.writerow(row) TypeError: 'str' 不支持缓冲区接口 或者不是在“call_accessionsByaffliction()”函数中写入csv文件,而是在执行函数后将结果写入csv文件吗?有什么帮助吗?非常感谢 您能否确认 call_accessionsByafflication() 是否正在返回字符串块并将其传递给 cs_writer()【参考方案2】:

如果您正在处理数据,我强烈建议您研究 Pandas。此外,对于这样的论坛,最好省略__main__ 支票。这是一个未经测试的代码,它可以完成您在 Pandas 中尝试做的事情。

import pandas

connection_string = "'mysql://root:1232580@localhost/db'"
df = pandas.read_sql_query('EXEC AccessionsBycauseOfAffliction_year', connection_string)
df.to_csv('AccessionsBycauseOfAffliction_year.csv')

【讨论】:

抱歉我没有安装 pandas 安装非常简单:pip install pandas【参考方案3】:

如果你能找到SP,调用你可以使用下面的代码 请提供更多您想要代码仅用于将结果存储在 csv 中的格式?

from mysql.connector import MySQLConnection, Error
from python_mysql_dbconfig import read_db_config


    def call_find_by_isbn():
        try:
            db_config = read_db_config()
            conn = MySQLConnection(**db_config)
            cursor = conn.cursor()

            args = ['1236400967773', 0]
            result_args = cursor.callproc('AccessionsBycauseOfAffliction_year', args)

            print(result_args[1])

        except Error as e:
            print(e)

        finally:
            cursor.close()
            conn.close()

    if __name__ == '__main__':
        call_find_by_isbn()

【讨论】:

是的。我试图将结果保存在 csv 文件中。但还是想不出办法 好的,所以您可以找到存储过程,唯一的问题是将结果存储在 CSV 文件中会给您代码,或者您可以尝试@chthonicdaemon 给出的解决方案 是的,我的存储过程是“AccessionsBycauseOfAffliction_year()”,我正在寻找将我的结果集存储在 csv 文件中的代码。我更喜欢使用相同的方法而不是使用熊猫。有什么帮助吗?

以上是关于在python中调用mysql存储过程并将结果写入csv文件的主要内容,如果未能解决你的问题,请参考以下文章

VB调用SQL存储过程异步执行问题

如何在kitura应用程序中调用mysql存储过程

python查询数据库并将结果写入Excel,保存至本地

存储过程是不是可以调用截断 veiw 表并将数据输入到 MySql 中的视图表中[关闭]

MySQL 连接器/Python 存储过程插入未提交

MySQL 存储过程,获取使用游标查询的结果集