无法让 MySQL 连接器/Python 返回字典

Posted

技术标签:

【中文标题】无法让 MySQL 连接器/Python 返回字典【英文标题】:Can't get MySQL Connector/Python to Return Dictionary 【发布时间】:2018-01-31 07:29:46 【问题描述】:

我有一个 Python 应用程序,我在其中调用 mysql 存储过程,如下所示:

import mysql.connector
proc = 'audit_report'
parms = [data['schoolid'], dateToISO(data['startdatedefault'],'from'), dateToISO(data['enddatedefault'],'to'), joinIntList(data['studypgms'], joinWith), joinIntList(data['fedpgms'], joinWith), joinIntList(data['statuses'], joinWith), data['fullssndefault']]
conn = mysql.connector.connect(user='usr', database='db', password='pwd')
cursor = conn.cursor(dictionary=True)
cursor.callproc(proc, parms)
for result in cursor.stored_results():
    print(result.fetchall())

我将数据作为元组列表返回,即标准输出。由于我使用的是连接器版本 2.1.7,因此文档说添加

dictionary=True

游标声明应该导致行集作为字典列表返回,列名作为每个字典的键。我的应用程序和文档中的示例之间的主要区别在于我使用的是 cursor.callproc(),而示例使用 cursor.execute() 和实际的 sql 代码。

我试过了

print(cursor.column_names)

看看我是否可以通过这种方式获取列名,但我得到的只是

('@_audit_report_arg1', '@_audit_report_arg2', '@_audit_report_arg3', '@_audit_report_arg4', '@_audit_report_arg5', '@_audit_report_arg6', '@_audit_report_arg7')

看起来更像是存储过程的输入参数。

有什么方法可以实际获取返回数据的列名吗?该过程有点复杂,并且包含交叉表类型的操作,但从 MySQL Workbench 调用相同的存储过程很高兴提供列名。

通常,知道输出应该是什么,我可以硬编码列名,除了这个过程交叉表最后几列的数据,并且在查询运行之前它们会是什么是不可预测的。 谢谢...

【问题讨论】:

***.com/a/5058950/7383995 这可能对你有帮助!!! 感谢@legend-is-back,但没有帮助。那篇文章适用于不支持 Python 3 的 MySqlDb。我正在使用 mysql 连接器/Python。当我打印 cursor.description 时,我得到: [('@_check_register_report_arg1', 250, None, None, None, None, 1, 0), ('@_check_register_report_arg2', 250, None, None, None, None, 1, 0) 等。没有列名,只有参数信息。 如果您使用的是 python 3,我建议使用 pymysql,我将 oymsyql 用于 python 3,将 mysqldb 用于 2,7 以及它在两者中都适用的解决方案 【参考方案1】:

您可以在 python3 中使用 pymysql,它应该可以正常工作!

import pymysql.cursors
connection = pymysql.connect(host='',
                             user='',
                             password='',
                             db='test',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

try:
    with connection.cursor() as cursor:
        # Read a single record
        sql = "query"
        cursor.execute(sql)
        result = cursor.fetchone()
        num_fields = len(cursor.description)
        field_names = [i[0] for i in cursor.description]
        print (field_names)
finally:
    connection.close()

【讨论】:

嗯,这就像一个魅力。现在我有如下记录: 'EnrollmentStatus': 'Continuing', 'Amount': Decimal('1732.00'), 'CkNo': 71515, 'CheckTo': 'School', 'CkDate': datetime.datetime(2015, 7, 15, 0, 0), 'FedPgmName': 'DL 补贴', 'AwardYear': '1516', 'StudentName': 'xxx redacted xxx': 'Diagnostic Medical Sonography I', 'FedPgmID': 8, ' formattedSSN': 'xxxx-xx-xxxx', 'PayPeriod': '1', 'SSN': 'xxxxxxxxx', 'SchedDate': datetime.datetime(2015, 7, 15, 0, 0), 'CampusName': '主要的'。完美! 有点奇怪:我现在在我的服务器控制台中得到了这个:/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pymysql/cursors.py:99 : 警告: (1292, "Incorrect date value: '2015-07-16 23:59:59' for column '_toDate' at row 1") self._do_get_result() 不知道这是怎么回事,但这只是一个警告应该没问题吧?

以上是关于无法让 MySQL 连接器/Python 返回字典的主要内容,如果未能解决你的问题,请参考以下文章

用python操作mysql数据库(之数据查询结果返回字典类型)

无法让 pyparsing Dict() 返回嵌套字典

mysql/python 连接器在处理空值时使用参数和字典死机

MySQL Python连接器无法获取结果

python查询mysql以字典返回

python MySQL执行SQL查询结果返回字典