SQL Alchemy 获取列名称

No *_*ncy 0 python postgresql sqlalchemy

如果您在 SQL Alchmey 中创建了一个实体,您可以在稍后获取您指定的列名称以在自定义语句中使用。

例如,这是数据实体的第一部分:

class ReportMetadataEntity(Base, ReportMetadata):
    __tablename__ = "reports_metadata"
    __mapper_args__ = {"eager_defaults": True}

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, name="id")
    application_customer_id = Column(
        String,
        nullable=False,
        name="application_customer_id",
    )
Run Code Online (Sandbox Code Playgroud)

有没有办法调用 ReportMetadataEntity.id.name 或其他一些属性来获取字符串“id”?

谢谢

sna*_*erb 5

使用运行时检查 API,它将在传递 ORM 模型类时返回映射器:

>>> from sqlalchemy import inspect
>>>
>>> insp = inspect(ReportMetadataEntity)
>>> insp.columns.id.name
'id'
>>> # insp.c.id.name is equivalent
Run Code Online (Sandbox Code Playgroud)

数据库中的列名和类中的列名可能不同,例如:

>>> from sqlalchemy import inspect
>>>
>>> insp = inspect(ReportMetadataEntity)
>>> insp.columns.id.name
'id'
>>> # insp.c.id.name is equivalent
Run Code Online (Sandbox Code Playgroud)

映射器将通过类中的名称访问列:

foo = Column(String, name='bar')  # "foo" in the class, "bar" in the database.
Run Code Online (Sandbox Code Playgroud)

相比之下,通过基础表访问需要使用数据库中的列名:

>>> tbl = MyModel.__table__
>>> tbl.c.foo.name
Traceback (most recent call last):
  ...
KeyError: 'foo'
>>> 
>>> tbl.c.bar.name
'bar'
Run Code Online (Sandbox Code Playgroud)