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