python mysql.connector DictCursor?

时间:2014-03-31 18:55:49

标签: python mysql mysql-python mysql-connector-python

在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的创造者最终会为我们做这件事吗?

4 个答案:

答案 0 :(得分:18)

根据这篇文章,可以通过传入' 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阶段。

答案 1 :(得分:10)

可能的解决方案涉及对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)

答案 2 :(得分:8)

此示例有效:

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文档中的{{1}}文档示例:http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html

答案 3 :(得分: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。