如何以编程方式获取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
相关产品推荐
相关产品推荐

