Я ищу способ анализировать классы/объекты SQLAlchemy ORM для определения типов и других ограничений (как максимальные длины) свойств объекта.
Например, если у меня есть декларативный класс:
class User(Base):
__tablename__ = "USER_TABLE"
id = sa.Column(sa.types.Integer, primary_key=True)
fullname = sa.Column(sa.types.String(100))
username = sa.Column(sa.types.String(20), nullable=False)
password = sa.Column(sa.types.String(20), nullable=False)
created_timestamp = sa.Column(sa.types.DateTime, nullable=False)
Я хотел бы смочь узнать что'fullname
'поле должно быть Строкой с максимальной длиной 100 и nullable. И'created_timestamp
'поле является DateTime и не nullable.
Что-то вроде:
table = User.__table__
field = table.c["fullname"]
print "Type", field.type
print "Length", field.type.length
print "Nullable", field.nullable
РЕДАКТИРОВАТЬ:
В грядущей версии 0.8 есть Новая система проверки классов :
Новая Система проверки классов
Статус: завершена, нужны документы
Многие пользователи SQLAlchemy пишут системы, требующие возможности проверять атрибуты сопоставленного класса, включая возможность получить в столбцах первичного ключа, отношениях объектов, простых атрибутах и т. д., как правило, для создания систем маршаллинга данных, таких как схемы преобразования JSON / XML и библиотеки форм курса в изобилии.
Первоначально модель «Таблица и столбец» была исходной контрольной точкой, имеющей хорошо документированную систему. Хотя модели SQLAlchemy ORM также являются полностью самоанализом, это никогда не было полностью стабильной и поддерживаемой функцией, и пользователи, как правило, не имели четкого представления, как получить эту информацию .
0.8 имеет план по созданию согласованного, стабильного и полностью документированного API для этой цели, который предоставит систему проверки, которая работает с классами, экземплярами и, возможно, с другими вещами. Хотя многие элементы этой системы уже доступны, план состоит в том, чтобы заблокировать API, включая различные средства доступа, доступные из таких объектов, как Mapper, InstanceState и MapperProperty:
(перейдите по ссылке для получения дополнительной информации)