web-dev-qa-db-ja.com

python mysql.connector DictCursor?

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の作成者が最終的にこれを行うと思いますか?

17
panofish

可能な解決策は、次のように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)
_
11
panofish

この記事によると、カーソルコンストラクタに「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 は、これらの新しい機能が執筆時点でアルファ段階にあることを示唆しています。

20
J1MF0X

この例は動作します:

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

8
Blairg23

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を掘り下げました。

4
KenH