无法让 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数据库(之数据查询结果返回字典类型)