【问题标题】:SQLAlchemy introspectionSQLAlchemy 内省
【发布时间】:2019-02-03 13:30:24
【问题描述】:

我想要做的是从 SqlAlchemy 实体定义中获取所有它的 Column(),确定它们的类型和约束,以便能够预验证、转换数据并向用户显示自定义表单。

如何自省?

例子:

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)

我想得到这个id、title、出生日期,确定他们的限制(比如title是字符串,最大长度是512或者birth_date是datetime等)

谢谢

【问题讨论】:

    标签: python sqlalchemy introspection


    【解决方案1】:

    如果您使用的是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
    

    【讨论】:

    • 很好,谢谢。我没想到列本身没有元信息,所以我尝试像 User.__getattr__('name') 一样访问它
    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2012-07-22
    • 2018-11-03
    • 2014-01-06
    • 2016-03-13
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多