Преобразуйте sqlalchemy объект строки в Python dict

Каждая камера в Unity имеет накладные расходы, поэтому чем меньше камер в сцене, тем лучше. Подумайте, можно ли использовать командные буферы для достижения желаемого эффекта.

219
задан Anurag Uniyal 10 September 2013 в 18:34
поделиться

7 ответов

Я не смог получить хороший ответ, поэтому использую следующее:

def row2dict(row):
    d = {}
    for column in row.__table__.columns:
        d[column.name] = str(getattr(row, column.name))

    return d

Правка: если вышеприведенная функция слишком длинная и не подходит для некоторых вкусов, то здесь один лайнер (питон 2. 7+)

row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns}
137
ответ дан 23 November 2019 в 04:08
поделиться

Он понадобится вам повсюду в вашем проекте, я отвечаю, @anurag ответил, что он отлично работает. до этого момента я использовал его, но он испортит весь ваш код, а также не будет работать с изменением сущности.

Скорее попробуйте это, унаследуйте ваш базовый класс запросов в SQLAlchemy

from flask_sqlalchemy import SQLAlchemy, BaseQuery


class Query(BaseQuery):
    def as_dict(self):
        context = self._compile_context()
        context.statement.use_labels = False
        columns = [column.name for column in context.statement.columns]

        return list(map(lambda row: dict(zip(columns, row)), self.all()))


db = SQLAlchemy(query_class=Query)

после этого, где бы вы ни определяли метод объекта «as_dict».

0
ответ дан 23 November 2019 в 04:08
поделиться

Выражение, через которое вы выполняете итерацию, вычисляется в список объектов модели , а не в строки. Таким образом, их правильное использование:

for u in session.query(User).all():
    print u.id, u.name

Вам действительно нужно преобразовывать их в диктаты? Конечно, способов много, но тогда вам не нужна ORM часть SQLAlchemy:

result = session.execute(User.__table__.select())
for row in result:
    print dict(row)

Update: Взгляните на модуль sqlalchemy.orm.attributes. Он имеет набор функций для работы с состоянием объектов, которые могут быть вам полезны, особенно instance_dict().

.
8
ответ дан 23 November 2019 в 04:08
поделиться

В соответствии с @zzzeek в комментариях:

обратите внимание, что это правильный ответ для современных версий SQLAlchemy, предполагая, что "строка" является основным объектом строки, а не ORM-картой instance.

for row in resultproxy:
    row_as_dict = dict(row)
73
ответ дан 23 November 2019 в 04:08
поделиться
class User(object):
    def to_dict(self):
        return dict([(k, getattr(self, k)) for k in self.__dict__.keys() if not k.startswith("_")])

Это должно сработать.

1
ответ дан 23 November 2019 в 04:08
поделиться
from sqlalchemy.orm import class_mapper

def asdict(obj):
    return dict((col.name, getattr(obj, col.name))
                for col in class_mapper(obj.__class__).mapped_table.c)
12
ответ дан 23 November 2019 в 04:08
поделиться

У меня есть вариант ответа Марко Мариани, выраженный как декоратор. Основное отличие состоит в том, что он обрабатывает списки сущностей, а также безопасно игнорирует некоторые другие типы возвращаемых значений (что очень полезно при написании тестов с использованием имитаций):

@decorator
def to_dict(f, *args, **kwargs):
  result = f(*args, **kwargs)
  if is_iterable(result) and not is_dict(result):
    return map(asdict, result)

  return asdict(result)

def asdict(obj):
  return dict((col.name, getattr(obj, col.name))
              for col in class_mapper(obj.__class__).mapped_table.c)

def is_dict(obj):
  return isinstance(obj, dict)

def is_iterable(obj):
  return True if getattr(obj, '__iter__', False) else False
1
ответ дан 23 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: