Предполагая, что следующие функции будут добавлены к class User
, следующие будут возвращать все пары ключ-значение всех столбцов:
def columns_to_dict(self):
dict_ = {}
for key in self.__mapper__.c.keys():
dict_[key] = getattr(self, key)
return dict_
в отличие от других ответов возвращаются все, кроме только тех атрибутов объекта, которые являются Column
атрибутами на уровне класса объекта. Следовательно, _sa_instance_state
или любой другой атрибут SQLalchemy , или вы добавляете к объекту, не включены. Ссылки
РЕДАКТИРОВАТЬ: забудьте, что это также работает на унаследованных столбцах.
hybrid_propery
расширение
Если вы также хотите включить атрибуты hybrid_property
, сработает следующее:
from sqlalchemy import inspect
from sqlalchemy.ext.hybrid import hybrid_property
def publics_to_dict(self) -> {}:
dict_ = {}
for key in self.__mapper__.c.keys():
if not key.startswith('_'):
dict_[key] = getattr(self, key)
for key, prop in inspect(self.__class__).all_orm_descriptors.items():
if isinstance(prop, hybrid_property):
dict_[key] = getattr(self, key)
return dict_
Здесь я предполагаю, что вы помечаете столбцы началом _
, чтобы указать, что вы хотите скрыть их, потому что вы обращаетесь к атрибуту с помощью hybrid_property
или вы просто не хотите их показывать. Ссылка
Тип all_orm_descriptors
также возвращает hybrid_method и AssociationProxy , если вы также хотите включить их.
Замечания к другим ответам
Каждый ответ (например, 1 , 2 ), основанный на атрибуте __dict__
, просто возвращает все атрибуты объекта. Это может быть гораздо больше атрибутов, чем вы хотите. Как мне грустно, это включает _sa_instance_state
или любой другой атрибут, который вы определяете для этого объекта.
Каждый ответ (например, 1 , 2 ), основанный на функции dict()
, работает только на SQLalchemy объектах строк, возвращаемых session.execute()
not на классах, с которыми вы работаете, например, class User
из вопроса.
Решающий ответ , основанный на row.__table__.columns
, определенно не будет работать. row.__table__.columns
содержит имена столбцов базы данных SQL. Эти могут быть только равными имени атрибута объекта python. Если нет, вы получите AttributeError
.
Для ответов (например, 1 , 2 ), основанных на class_mapper(obj.__class__).mapped_table.c
, то же самое.