You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以编程方式获取SQLAlchemy声明式表的列信息

如何在SQLAlchemy声明式表中编程式获取列定义

其实SQLAlchemy本身就提供了直接获取列信息的方式,不用绕远路用通用Python反射,下面给你几种实用的方案,覆盖类和实例两种场景:

从表类本身获取列信息

1. 直接访问__table__.columns

每个声明式表类都自带__table__属性,它存储了表的所有元数据,其中columns属性是所有列对象的集合。你可以轻松转成需要的格式:

  • 获取列名列表:
column_names = [col.name for col in SomeTable.__table__.columns]
# 输出: ['col1', 'col2']
  • 获取列名到Column对象的字典:
column_dict = {col.name: col for col in SomeTable.__table__.columns}
# 输出: {'col1': Column('col1', Integer(), table=<hello>), 'col2': Column('col2', String(length=10), table=<hello>)}

2. 使用SQLAlchemy的inspect模块(官方推荐)

inspect是SQLAlchemy专门用于反射和检查对象的工具,用它获取列信息更规范,尤其适合复杂场景:

from sqlalchemy import inspect

# 获取表类的列定义
table_inspect = inspect(SomeTable)
column_names = [col.name for col in table_inspect.columns]
column_dict = {col.name: col for col in table_inspect.columns}

从表实例获取列信息(含值)

如果是从实例出发,除了可以通过instance.__class__.__table__.columns复用上面的方法,还可以直接获取列名和对应的值:

1. 手动构建列名-值字典

new_row = SomeTable(col1=123, col2="abc")
column_value_dict = {col.name: getattr(new_row, col.name) for col in new_row.__table__.columns}
# 输出: {'col1': 123, 'col2': 'abc'}

2. 使用inspect获取实例属性

from sqlalchemy import inspect

instance_inspect = inspect(new_row)
# 获取所有列属性(仅包含表定义的列,不包含其他实例属性)
column_value_dict = {attr.key: instance_inspect.attrs[attr.key].value for attr in instance_inspect.mapper.column_attrs}

封装成你想要的columns()方法

如果你希望像示例那样直接调用SomeTable.columns()或者new_row.columns(),可以给基类Base添加通用方法,这样所有继承的表类都能使用:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy import inspect

Base = declarative_base()

# 给表类添加columns方法,返回列名-Column对象字典
@classmethod
def table_columns(cls):
    return {col.name: col for col in cls.__table__.columns}

# 给实例添加columns方法,返回列名-值字典
def instance_columns(self):
    return {col.name: getattr(self, col.name) for col in self.__table__.columns}

# 绑定到基类
Base.table_columns = table_columns
Base.instance_columns = instance_columns

# 测试
class SomeTable(Base):
    __tablename__ = "hello"
    col1 = Column(Integer)
    col2 = Column(String(10))

# 调用类方法
print(SomeTable.table_columns())
# 调用实例方法
new_row = SomeTable(col1=456, col2="def")
print(new_row.instance_columns())

这样就能实现你想要的简洁调用方式了,这些方法都是SQLAlchemy原生支持的,比通用反射更可靠,也更符合ORM的设计思路。

内容的提问来源于stack exchange,提问作者Mark Gerolimatos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:18:31