SQLAlchemy самоанализ классов / объектов ORM - PullRequest
5 голосов
/ 07 мая 2010

Я ищу способ проанализировать классы / сущности 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 и иметь значение NULL. А поле 'created_timestamp' является DateTime и не может иметь значения NULL.

1 Ответ

11 голосов
/ 07 мая 2010

Что-то вроде:

table = User.__table__
field = table.c["fullname"]
print "Type", field.type
print "Length", field.type.length
print "Nullable", field.nullable

EDIT:

В следующей версии 0.8 установлена ​​ Система проверки нового класса :

Инспекционная система нового класса

Статус: завершен, нужны документы

Многие пользователи SQLAlchemy пишут системы, требующие возможности проверить атрибуты сопоставленного класса, в том числе возможность получить в первичном ключе столбцы, объектные отношения, простой атрибуты и т. д., как правило, для целей строительства системы сортировки данных, такие как схемы преобразования JSON / XML и библиотеки формы курса в изобилии.

Первоначально модель «Стол» и «Столбец» были первоначальной проверкой. очки, которые имеют хорошо документированную систему. Хотя SQLAlchemy ORM модели также полностью самоанализ, это никогда не было полностью стабильная и поддерживаемая функция, и пользователи, как правило, не имеют четкого Идея, как получить эту информацию.

0.8 имеет план по созданию согласованного, стабильного и полностью документированного API для этой цели, который обеспечил бы систему контроля, которая работает над классами, экземплярами и, возможно, другими вещами. В то время как многие элементы этой системы уже доступны, план состоит в том, чтобы заблокировать API, включая различные средства доступа, доступные из таких объекты как Mapper, InstanceState и MapperProperty:

(для получения дополнительной информации перейдите по ссылке)

...