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 远程连接 MySQL
python3-连接MySQL(mysql.connector与MySQLdb区别)