2010-05-06 3 views
5

Я ищу способ изучить классы или сущности SQLAlchemy ORM для определения типов и других ограничений (например, максимальной длины) свойств объекта.SQLAlchemy introspection 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 и обнуляемое , И поле 'created_timestamp' является DateTime и не может быть равно NULL.

ответ

11

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

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

EDIT:

Предстоящий 0,8 версия имеет New Class Inspection System:

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

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

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

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

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

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

+0

Я проводил так много времени с 'declarative', что забыл все о том, как смотреть на столбцы. Благодаря! –