Чтение атрибутов объекта из базы данных в Python - PullRequest
0 голосов
/ 17 января 2019

У меня есть предмет класса:

class Item: #This item is for the contents of a given site.
    def __init__(self, site, username, password):
        self.site = site #Each site should have a unique name
        self.username = username #site username/email
        self.password = password #site password

И сохраните его в базе данных и сможете получить его без каких-либо проблем, однако затем я использую для каждого цикла, чтобы прочитать каждый элемент в отдельности (что также работает), но затем, когда я пытаюсь получить доступ к данному атрибуту, например. пароль я получаю ошибку:

AttributeError: 'tuple' object has no attribute 'password'

Это мой прочитанный код:

def read():
    mydb = mysql.connector.connect(
        host="localhost",
        user="user",
        passwd="pass",
        database="thisDb"
    )
    mycursor = mydb.cursor()

    mycursor.execute("SELECT * FROM data")

    myresult = mycursor.fetchall()
    for x in myresult:
        print(x.password)

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Я бы настоятельно рекомендовал не использовать *, а объявлять столбцы. Так как метод fetchall() возвращает список кортежей. Если вы знаете, какие столбцы есть, вы можете распаковать результат следующим образом.

for x in myresult:
    column1, column2, column3 = x

0 голосов
/ 17 января 2019

Метод fetchall() возвращает list из tuples. Из документов:

Метод выбирает все (или все оставшиеся) строки из набора результатов запроса. и возвращает список кортежей. Если больше нет доступных строк, это возвращает пустой список.

Итак, в этом разделе ваш код:

myresult = mycursor.fetchall()
for x in myresult:
    print(x.password)

myresult - это список, а x - это tuple.

Вместо использования необработанного курсора существует класс курсора MySQLCursorNamedTuple . Это позволит вам получить доступ к столбцам с синтаксисом поиска атрибутов без необходимости создания экземпляра класса.

Вот документированный пример:

cnx = mysql.connector.connect(database='world')
cursor = cnx.cursor(named_tuple=True)
cursor.execute("SELECT * FROM country WHERE Continent = 'Europe'")

print("Countries in Europe with population:")
for row in cursor:
    print("* {Name}: {Population}".format(
        Name=row.Name,
        Population=row.Population
    ))

Кроме того, вы можете попробовать MySQLCursorDict, который вернет сопоставление имен столбцов со значениями.

Вы можете легко преобразовать результат dict в экземпляр вашего объекта, например ::101033.

myresult = dictcursor.fetchall()
for x in myresult:
    inst = Item(**x)
    print(inst.password)

Или используйте ORM, например SQLAlchemy , который звучит так, как будто он может удовлетворить ваши потребности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...