Конвертировать py mysql результат в объект - PullRequest
0 голосов
/ 06 января 2020

Я пришел к Python с PHP, поэтому я перепутал некоторые вещи, которые я делал в PHP. Например, у меня есть класс Database_object, который имеет некоторые распространенные методы базы данных, такие как:

class DatabaseObject {

protected static $table_name;
protected static $db_fields;

public static function find_all() {
    return self::find_by_query("SELECT * FROM ".static::$table_name);
}

...
private static function instantiate($record) {
    $object = new self;
    foreach($record as $attribute=>$value) {
        if($object->has_attribute($attribute)) {
            $object->$attribute = $value;
        }
    }
    return $object;
}
}

И некоторые дочерние классы, такие как:

class User extends DatabaseObject {


protected static $table_name = "users";
protected static $db_fields = array('id', 'gid', 'username', 'hashed_password', 'first_name', 'last_name', 'e_mail', 'phone_number', 'position', 'last_login', 'comment', 'supplier_id');

У меня есть вопрос о реализации stati c , но теперь topi c как сделать этот экземпляр метод в Python? У меня есть метод, подобный этому:

   def FindAll(self):
        query = 'SELECT * FROM ' + self._TableName
        try:
            self.cur.execute(query)
        except(ValueError):
            print("Error " + ValueError)
        else:
            return self.cur.fetchall() 

Но этот возвращает массивы, и я хочу сделать их объектами, как в методе экземпляра в PHP. Например, если я вызываю FindAll для пользовательского класса. Я хочу получить массив пользователей, а затем использовать их как:

   for user in users:
       print("Username: {}, Name: {} {}".format(user.username, user.first_name, user.second_name)

, а не:

print("Username: {}, Name: {} {}".format(user[1], user[3], user[4]))

, как сейчас.

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Что я понимаю в вашей топике c, так это то, что вы хотите получить объект python dict, а не объект list.

Вы можете просмотреть диктовку аналогично что ты ищешь. Пример:

people = {"John": "Doe", "Eddy": "Malou"}

Вы можете получить доступ к именам из имен, подобных этому

people["John"] # will return Doe
people["Eddy"] # will return Malou

С py mysql по умолчанию вы получите список результатов при использовании select query.

Если вы хотите получить dict, вам нужно указать, что вы хотите получить заголовки. Вы можете сделать это следующим образом:

results = {}
headers = [row[0] for row in cursor.description]
index = 0

"""
Browse a dict to return a dict with the following format:
results = {
    header1: [result_list1],
    header2: [result_list2],
    header3: [result_list3]
}
"""

for header in headers:
    result_list = []

    for element in result:
        result_list.append(element[index])

    results[header] = result_list
    index +=1

return results

Затем вы можете просмотреть свои результаты следующим образом, заменив 'headerX' своим именем столбца / заголовка:

for result in results:
    print(f"My first header {result['header1']}, my second header {result['header2']} and my last header {result['header3']}.")
0 голосов
/ 06 января 2020

Используйте py mysql .cursors.DictCursor, который будет возвращать строки, представленные в виде словарей, сопоставляющих имена столбцов со значениями.

>>> from pymysql.cursors import DictCursor
>>> with pymysql.connect(db='foo', cursorclass=DictCursor) as cursor:
...     print cursor
... 

Кредит: Марк Амери

...