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の作成者が最終的にこれを行うと思いますか?
可能な解決策は、次のように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)
_
この記事によると、カーソルコンストラクタに「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()が予期しないキーワード引数 'dictionary'を取得しました
そして私は試しました:
_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 は、これらの新しい機能が執筆時点でアルファ段階にあることを示唆しています。
この例は動作します:
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
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を掘り下げました。