programing

python mysql.connector DictCursor?

procenter 2023. 9. 27. 20:10
반응형

python mysql.connector DictCursor?

파이썬에서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 제작자들이 결국 우리를 위해 이것을 할 것이라고 생각합니다.

이 기사에 따르면 ' diction리='를 통과하면 사용할 수 있습니다.커서 생성자에게 참입니다. 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()에 예기치 않은 키워드 인수 'name_tuple'이(가) 발생했습니다.

이것도 해봤어요cursor = MySQLCursorDict(cnx)

하지만 소용이 없었습니다.http://downloads.mysql.com/docs/connector-python-relnotes-en.a4.pdf 의 문서에 따르면 이 새로운 기능들이 알파 단계에 있다고 나와 있기 때문에 저는 분명히 여기서 잘못된 버전을 사용하고 있으며 인내심을 가져야 한다고 생각합니다.

가능한 해결책은 하위 분류를 포함합니다.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()메소드는 a를 반환합니다.dictionary대신에tuple.

mysql 포럼에서 발견한 내용인데, mysql 개발자들이 직접 올린 것으로 알고 있습니다.언젠가 그들이 그것을 mysql connector package에 추가했으면 좋겠습니다.

제가 테스트해봤는데 효과가 있네요.

업데이트: 칼 M.W가 아래에 언급한 바와 같이... 이 하위 클래스는 mysql.connector의 v2에서 더 이상 필요하지 않습니다.mysql.connector가 업데이트되었으며 이제 다음 옵션을 사용하여 사전 커서를 활성화할 수 있습니다.

cursor = db.cursor(dictionary=True)

이 예제는 다음과 같이 작동합니다.

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 을 조사하기만 하면 됩니다.

기본 커서가 열 이름이 없는 튜플을 반환하는 것도 같은 문제가 있었습니다.

답은 여기에 있습니다.

MySQLdb.cursors를 사용하는 동안 오류가 발생했습니다.MYSQL_CURRSOR CLASS의 DictCursor

app.config["MYSQL_CURSERCLASS"] = "딕커서"

언급URL : https://stackoverflow.com/questions/22769873/python-mysql-connector-dictcursor

반응형