python mysql.connector DictCursor?

Posted

技术标签:

【中文标题】python mysql.connector DictCursor?【英文标题】:python mysql.connector DictCursor? 【发布时间】:2014-05-11 06:46:00 【问题描述】:

在 Python mysqldb 中,我可以像这样将游标声明为字典游标:

cursor = db.cursor(MySQLdb.cursors.DictCursor) 

这将使我能够按如下名称引用 cursor 循环中的列:

for row in cursor:   # Using the cursor as iterator 
    city = row["city"]
    state = row["state"]

是否可以使用此 MySQL 连接器创建字典游标? http://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html

他们的例子只返回一个元组。

我想 MySQL 的创造者最终会为我们做这件事吗?

【问题讨论】:

你有没有得到一个很好的答案。如果不是这样,我将注销 Python3 和 mySQL,因为它还没有准备好迎接黄金时段。说真的,F 他们在 Pythin 3 使用了 6 年多之后才扔掉这些垃圾。 查看 jpatokal 下面的评论... 你需要 Python/Connector v2.0.0+ 来获取 MySQLCursorDict。您可以使用 mysql.connector.__version__ 检查您的版本。 您应该为 Python 使用 mysql.connector。然后你可以使用这个例子:dev.mysql.com/doc/connector-python/en/…。我还在该链接的末尾添加了一条用户评论,讨论了如何使用存储过程来实现这一点。 【参考方案1】:

根据这篇文章,它可以通过将 'dictionary=True' 传递给游标构造函数来获得: http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html

所以我尝试了:

cnx = mysql.connector.connect(database='bananas')
cursor = cnx.cursor(dictionary=True)

并得到: TypeError: cursor() 得到了一个意外的关键字参数“字典”

我试过了:

cnx = mysql.connector.connect(database='bananas')
cursor = cnx.cursor(named_tuple=True)

并得到: TypeError: cursor() 得到了一个意外的关键字参数“named_tuple”

我也试过这个:cursor = MySQLCursorDict(cnx)

但无济于事。显然,我在这里使用了错误的版本,我怀疑我们只需要耐心等待,因为http://downloads.mysql.com/docs/connector-python-relnotes-en.a4.pdf 的文档表明这些新功能在撰写本文时处于 alpha 阶段。

【讨论】:

伟大的更新...我认为这只是时间问题。 您需要 Python/Connector v2.0.0+ 来获取 MySQLCursorDict。您可以通过mysql.connector.__version__查看您的版本。 太棒了!我刚刚更新到 v2,我的自定义 MySQLCursorDict cursor_class 通过生成一个列表而不是一个字典来停止工作。这解决了我的问题。将 cursor_class= 替换为 dictionary=True 在 v2 中有效。 这不是重要问题,但您的代码中似乎有多余的引号(例如,应该是 .connect(database='bananas'))。【参考方案2】:

一个可能的解决方案是像这样子类化MySQLCursor 类:

class MySQLCursorDict(mysql.connector.cursor.MySQLCursor):
    def _row_to_python(self, rowdata, desc=None):
        row = super(MySQLCursorDict, self)._row_to_python(rowdata, desc)
        if row:
            return dict(zip(self.column_names, row))
        return None

db = mysql.connector.connect(user='root', database='test')

cursor = db.cursor(cursor_class=MySQLCursorDict)

现在_row_to_python() 方法返回dictionary 而不是tuple

我在 mysql 论坛上找到了这个,我相信它是由 mysql 开发人员自己发布的。我希望他们有一天将它添加到 mysql 连接器包中。

我对此进行了测试,它确实有效。

更新:正如下面 Karl M.W 所提到的......这个子类在 mysql.connector 的 v2 中不再需要。 mysql.connector 已更新,现在您可以使用以下选项来启用字典游标。

cursor = db.cursor(dictionary=True)

【讨论】:

我一直使用这种方法,但是从 v2 开始你可以使用原生 dict 支持:cursor = db.cursor(dictionary=True) 是的,这仍然派上用场,因为大多数发行版仍然使用 v1.1:/【参考方案3】:

这个例子有效:

cnx = mysql.connector.connect(database='world')
cursor = cnx.cursor(dictionary=True)
cursor.execute("SELECT * FROM country WHERE Continent = 'Europe'")

print("Countries in Europe:")
for row in cursor:
    print("* Name".format(Name=row['Name']

请记住,在此示例中,'Name' 特定于所引用数据库的列名。

另外,如果您想使用存储过程,请改为:

cursor.callproc(stored_procedure_name, args)
result = []
for recordset in cursor.stored_results():
    for row in recordset:
        result.append(dict(zip(recordset.column_names,row)))

其中stored_procedure_name 是要使用的存储过程的名称,args 是该存储过程的参数列表(如果没有要传入的参数,请将此字段留空,如 [])。

这是来自MySQL 文档的示例:http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html

【讨论】:

谢谢!我花了很长时间才找到这个解决方案。对于 callproc,光标会忽略 dictionary=True。【参考方案4】:

使用 Python 3.6.2 和 MySQLdb 1.3.10 版,我可以使用它:

import MySQLdb
import MySQLdb.cursors

...

conn = MySQLdb.connect(host='...', 
                       <connection info>, 
                       cursorclass=MySQLdb.cursors.DictCursor)

try:
    with conn.cursor() as cursor:
        query = '<SQL>'
        data = cursor.fetchall()
        for record in data:
            ... record['<field name>'] ...

finally:
    conn.close()

我使用的是 PyCharm,只是简单地挖掘了 MySQLdb 模块 connections.py 和 cursors.py。

【讨论】:

鉴于 OP 的问题,这应该是选择的答案。 MySQLdb 和 mySQL connector 是两个不同的 Python 模块。 似乎也对我有用。这篇文章和一点或这一篇 ianhowson.com/blog/a-quick-guide-to-using-mysql-in-python 一切都按我的预期工作。

以上是关于python mysql.connector DictCursor?的主要内容,如果未能解决你的问题,请参考以下文章

python mysql connector

使用 Python mysql.connector 远程连接 MySQL

MySQL Connector/Python 开发者指南

python3-连接MySQL(mysql.connector与MySQLdb区别)

在 mysql-connector-python 中结束连接池

使用 python 库 mysql.connector 将 csv 插入 MySQL 数据库