Каждая камера в Unity имеет накладные расходы, поэтому чем меньше камер в сцене, тем лучше. Подумайте, можно ли использовать командные буферы для достижения желаемого эффекта.
Я не смог получить хороший ответ, поэтому использую следующее:
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}
Он понадобится вам повсюду в вашем проекте, я отвечаю, @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».
Выражение, через которое вы выполняете итерацию, вычисляется в список объектов модели , а не в строки. Таким образом, их правильное использование:
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()
.
В соответствии с @zzzeek в комментариях:
обратите внимание, что это правильный ответ для современных версий SQLAlchemy, предполагая, что "строка" является основным объектом строки, а не ORM-картой instance.
for row in resultproxy:
row_as_dict = dict(row)
class User(object):
def to_dict(self):
return dict([(k, getattr(self, k)) for k in self.__dict__.keys() if not k.startswith("_")])
Это должно сработать.
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)
У меня есть вариант ответа Марко Мариани, выраженный как декоратор. Основное отличие состоит в том, что он обрабатывает списки сущностей, а также безопасно игнорирует некоторые другие типы возвращаемых значений (что очень полезно при написании тестов с использованием имитаций):
@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