2012-07-04 1 views
3

Что я пытаюсь сделать, так это получить от определения сущности SqlAlchemy все, что это Column(), определить их типы и ограничения, чтобы иметь возможность предварительно проверять, преобразовывать данные и отображать пользовательские формы для пользователя.SQLAlchemy introspection

Как мне это понять?

Пример:

class Person(Base): 
    ''' 
     Represents Person 
    ''' 
    __tablename__ = 'person' 

    # Columns 
    id = Column(String(8), primary_key=True, default=uid_gen) 
    title = Column(String(512), nullable=False) 
    birth_date = Column(DateTime, nullable=False) 

Я хочу, чтобы получить этот идентификатор, название, дата рождения, определяют их ограничения (например, название строки и максимальная длина 512 или birth_date является даты и времени и т.д.)

Спасибо вы

ответ

6

Если вы используете sqlalchemy 0.8, то вы должны проверить новую функцию New Class Inspection System. Пример кода выписка из документации:

class User(Base): 
    __tablename__ = 'user' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    name_syn = synonym(name) 
    addresses = relationship(Address) 

# universal entry point is inspect() 
>>> b = inspect(User) 

# column collection 
>>> b.columns 
[<id column>, <name column>] 

В противном случае см Accessing Tables and Columns части документации. Снова извлечение кода из документа:

employees = Table(...) 
# or if using declarative 
#employees = Employee.__table__ 

# or just 
employees.c.employee_id 

# via string 
employees.c['employee_id'] 

# iterate through all columns 
for c in employees.c: 
    print c 

# access a column's name, type, nullable, primary key, foreign key 
employees.c.employee_id.name 
employees.c.employee_id.type 
employees.c.employee_id.nullable 
employees.c.employee_id.primary_key 
employees.c.employee_dept.foreign_keys 
+1

Ницца, спасибо. Я не ожидал, что есть мета-информация не в самих столбцах, поэтому я попытался получить к ней доступ, как Пользователь .__ getattr __ ('name') –

 Смежные вопросы

  • Нет связанных вопросов^_^