Python: использовать mysqldb для импорта таблицы MySQL в качестве словаря? - PullRequest
32 голосов
/ 02 февраля 2010

Кто-нибудь знает, как я могу использовать mysqldb, чтобы превратить таблицу MySQL с большим количеством строк в список объектов словаря в Python?

Я имею в виду превращение набора строк MySQL со столбцами «a», «b» и «c» в объект Python, который выглядит следующим образом:

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 }, { 'a':'Q', 'b':(1, 4), 'c':5.0 }, { 'a':'T', 'b':(2, 8), 'c':6.1 } ]

Спасибо:)

Ответы [ 4 ]

68 голосов
/ 02 февраля 2010

MySQLdb имеет отдельный класс курсора для этого, DictCursor. Вы можете передать класс курсора, который вы хотите использовать, в MySQLdb.connect ():

import MySQLdb.cursors
MySQLdb.connect(host='...', cursorclass=MySQLdb.cursors.DictCursor)
21 голосов
/ 10 мая 2015

Если вам нужно использовать больше курсоров, а MySQLdb.cursors.DictCursor нужен только один, вы можете сделать:

import MySQLdb
db = MySQLdb.connect(host='...', db='...', user='...t', passwd='...')

list_cursor = db.cursor()
dict_cursor = db.cursor(MySQLdb.cursors.DictCursor)
0 голосов
/ 28 мая 2019

с использованием PYTHON> = 3,6; здесь это работает следующим образом:

OBS .: здесь я использую 2 типа баз данных ORACLE 12g и MYSQL 5.6; и главный сервер - ORACLE, mysql используется только некоторыми частями программного обеспечения ... тогда ... код моего класса соединения:

здесь идет код из шеллскрипта ... тогда я просто привожу строку, чтобы показать здесь ...

myp3 = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ПАРОЛЬ MYSQL XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

import cx_Oracle
import MySQLdb
import MySQLdb.cursors

class oracle(object):
    def __init__(self, serverORACLE=3, MYSQL='N', serverMYSQL=3):
        ## ORACLE connection!
        try:

        if serverORACLE == 1:
            self.db = cx_Oracle.connect('sys/[xxxxPASSWORDxxxxx]@[xxxxxIP/HOSTxxxxxx]:1521/DATABASE_X')
            print('ORACLE [ system/[xxxxPASSWORDxxxxx]@[xxxxxIP/HOSTxxxxxx]:1521 ] ===> CONNECTED')

        if serverORACLE == 2:
            self.db = cx_Oracle.connect('system/[xxxxPASSWORDxxxxx]@[xxxxxIP/HOSTxxxxxx]:1521/DATABASE_X')
            print('ORACLE [ system/[xxxxPASSWORDxxxxx]@[xxxxxIP/HOSTxxxxxx]:1521 ] ===> CONNECTED')

        if serverORACLE == 3:
            self.db = cx_Oracle.connect('userLEVEL1/[xxxxPASSWORDxxxxx]@[xxxxxIP/HOSTxxxxxx]:1521/DATABASE_X')
            print('ORACLE [ userLEVEL1/[xxxxPASSWORDxxxxx]@[xxxxxIP/HOSTxxxxxx]:1521 ] ===> CONNECTED')

        if serverORACLE == 4:
            self.db = cx_Oracle.connect('userLEVEL2/[xxxxPASSWORDxxxxx]@[xxxxxIP/HOSTxxxxxx]:1521/DATABASE_X')
            print('ORACLE [ userLEVEL2/[xxxxPASSWORDxxxxx]@[xxxxxIP/HOSTxxxxxx]:1521 ] ===> CONNECTED')

        self.cursor = self.db.cursor()

    except Exception as e:
        count = 0
        S1 = ''
        for W in str(e):
            S1+=W
            count+=1 
            if count >= 40:
                S1+=' \n'
                count = 0
        print('\n\n ORACLE DATABASE ===> CONECTION FAILED!', 
                    '\n error - module: ', S1)

    ##conexao MYSQL
    if MYSQL=='S': 
        try:
            if serverMYSQL == 1:
                self.dbMySQL = MySQLdb.connect(user='root', host='XXXXXX HOST XXXXX', use_unicode=True, cursorclass=MySQLdb.cursors.DictCursor,
                                                charset='utf8', port=3306, passwd=myp3, db='XXXX')
                print('MySQL [ root / XXXXXX HOST XXXXX:3306 ] ===> CONNECTED')

            if serverMYSQL == 2:
                self.dbMySQL = MySQLdb.connect(user='XXXX USER XXXXX', host='XXXXXX HOST XXXXX', use_unicode=True, cursorclass=MySQLdb.cursors.DictCursor,
                                                charset='utf8', port=3306, passwd=myp3, db='XXXX')
                print('MySQL [ XXXX USER XXXXX / XXXXXX HOST XXXXX:3306 ] ===> CONNECTED')

            self.cursorMYSQL = self.dbMySQL.cursor()

        except Exception as e:
            count = 0
            S1 = ''
            for W in str(e):
                S1+=W
                count+=1 
                if count >= 40:
                    S1+=' \n'
                    count = 0
            print('\n\n MYSQL DATABASE ===> CONECTION FAILED!', 
                    '\n error - module: ', S1)

"" "

0 голосов
/ 03 ноября 2017

Это древний пост, и хотя этот ответ не совсем то, что искал ОП, он во многом совпадает. Вместо создания списка словарей, он генерирует словарь списков:

Также подумал, что предоставлю полный код для создания словаря:

import MySQLdb
import MySQLdb.cursors

dict_serv = MySQLdb.connect(host = 'localhost', user = 'root', passwd = 'mypassword', cursorclass = MySQLdb.cursors.DictCursor)

with dict_serv as c:
    c.execute("USE mydb")
    c.execute("SELECT col1, col2 FROM mytable WHERE id = 'X123'")

    # Save the dictionary to a separate variable
    init_dict = c.fetchall()

    # This line builds the column headers
    sql_cols = [ col[0] for col in c.description ]

    # This is a list comprehension within a dictionary comprehension
    # which builds the full dictionary in a single line.  
    sql_dict = { k : [ d[k] for d in init_dict ] for k in sql_cols }

Что дает:

{ 'col1': ['apple','banana'], 'col2':['red','yellow'] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...