我正在尝试编写一个类,该类将在sqlalchemy反映的表中查找某些列类型,然后根据数据类型对列的子集进行一些操作。
我可以正确地反映该表并获取date_types列表中所示的“ date”类型列的列表。但是,当到达table[name]
时,函数将失败,并显示以下错误:
*** TypeError: 'DeclarativeMeta' object is not subscriptable
如果我使用圆点下标而不是方括号,即table.col_name
,则可以访问表列属性,但看不到如何使用该语法遍历属性列表。
这是我的课程:
from pdb import set_trace
class dateRangeProfiler():
def __init__(self, session):
self.date_ranges = {}
self.date_types = [Date(), DateTime(), TIMESTAMP()]
self.session = session
print('date data types: ', str(self.date_types))
def __call__(self, table):
date_columns = self.getDateColumns(table)
print(date_columns)
date_column_profile = self.profileColumns(table, date_columns)
return date_column_profile
def getDateColumns(self, table):
columns = [(c.name, c.type) for c in table.__table__.columns if str(c.type) in [str(dt) for dt in self.date_types]]
return columns
def profileColumns(self, table, date_cols):
profile = {}
for (name, _) in date_cols:
set_trace()
print(name)
qry = self.session.query(func.max(table[name]).label("max_date"),
func.min(testTable[name]).label("min_date"),) # <-- fails here
res = qry.one()
max = res.max_date
min = res.min_date
profile.append({name: {'max':max, 'min':min}})
这是我叫探查器的方式:
date_range_profiler = dateRangeProfiler(sess)
date_range_profiler(my_table)
错误:
*** TypeError: 'DeclarativeMeta' object is not subscriptable
答案 0 :(得分:0)
该问题与sqlalchemy模块无关。使用变量引用访问对象的属性时,请使用getattr()
基本python函数。
qry = self.session.query(func.max(getattr(table,name)).label("max_date"),
func.min(getattr(table,name)).label("min_date"),)