订阅sqlalchemy表列

时间:2018-07-26 19:05:25

标签: python sqlalchemy

我正在尝试编写一个类,该类将在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

1 个答案:

答案 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"),)