Адресация столбцов таблицы в Python - PullRequest
1 голос
/ 23 августа 2011

Часто я выбираю данные из базы данных SQLite в список словарей, используя что-то вроде:

conn.row_factory = sqlite3.Row
c = conn.cursor()
selection = c.execute('select * from myTable')
dataset = selection.fetchall()
dataset1 = [dict(row) for row in dataset]

Однако, учитывая фон моей базы данных (Foxpro, SQL-сервер и т. Д.), Я более привык киспользуя формат table.column, который я могу получить используя:

dataset2 = [RowObj(row) for row in dataset]  

, где

class RowObj(dict):
    def __getattr__(self, name):
        return self[name]

Вопрос - Что предпочтительнее для адресации значений столбцов, таблицы ['столбца'] или таблицы.столбец?На мой взгляд, последний выглядит аккуратнее.Это просто вопрос личных предпочтений или есть плюсы и минусы каждого подхода?

Мне также нужно помнить, что однажды база данных может быть изменена с SQLite на что-то вроде строки MySQL, поэтому яя хочу минимальных изменений кода, если / когда это произойдет.

Я не хочу использовать пакет ORM, такой как SQLObject или SQLAlchemy, на данном этапе - пока я не уверен, что они принесут пользу моим приложениям.* С уважением, Алан

1 Ответ

2 голосов
/ 23 августа 2011

Некоторое время я боролся с синтаксисом row['column'], но в конце концов я предпочитаю его.Он имеет два явных преимущества:

  1. row['class'] - правильный синтаксис, но row.class - нет;ключевые слова не могут напрямую использоваться в качестве имен свойств.
  2. И, в более общем случае, если вы когда-нибудь создадите запрос, имена столбцов которого не являются допустимыми именами свойств (включая приведенный выше случай) в стиле словарясинтаксис позволит вам обратиться к этому столбцу.row.COUNT(*) явно недопустимый синтаксис, но row['COUNT(*)'] и т. Д. (Да, вы можете использовать AS в запросе к псевдониму, и это, конечно, хорошо. Тем не менее, это действительная проблема.)

Сказав это, ваш класс RowObj, конечно, поддерживает оба способа адресации столбцов.Я все же предпочел бы последовательность, хотя, и если у вас есть столбец class, он будет выглядеть странно, если вы обращаетесь к нему по-другому: row.widget, row.dingus, row['class'].(Одна из этих вещей не похожа на другую ...)

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