如何在sqlalchemy中将变量作为列名传递?

时间:2018-07-04 09:58:58

标签: python mysql flask sqlalchemy

我最近创建了一个脚本,该脚本允许用户既过滤表,又将剩余的列按升序和降序排序。这就是我写的:

    if 'desc' in request.form:
        if request.form['desc'] == 'date_time':
            display_test_results = test_result.query.order_by(desc(test_result.date_time)).filter(or_(test_result.date_time.like('%' +global_value_detailed+ '%'),                                                          
                                                    test_result.place_of_test.like('%' +global_value_detailed+ '%'),
                                                    test_result.part_number.like('%' +global_value_detailed+ '%'),
                                                    test_result.serial_number.like('%' +global_value_detailed+ '%'),
                                                    test_result.test_details.like('%' +global_value_detailed+ '%'),
                                                    test_result.result.like('%' +global_value_detailed+ '%')))

            return render_template('/detailed_test_data.html', title='Database Full', display_test_results=display_test_results)

        elif request.form['desc'] == 'part_number':

然后对我所有的列重复此操作,这里的问题是我有17列(在此示例中未全部使用。)因此,为了进行升序和降序排序,我有34批代码,占900行。这是大量的代码,这会减慢我的搜索/排序功能的生产率(我想是)。

有没有一种方法可以使用精致的代码,将request.form ['desc']值另存为变量,然后使用该变量告诉查询要看哪一列?我认为它最终看起来将类似于下面的代码。但是,当我运行此代码时,出现以下错误提示。

 if request.form['desc'] != '':
                    order_column = request.form['desc']

                    display_test_results = test_result.query.order_by(desc(test_result.order_column)).filter(or_(test_result.date_time.like('%' +global_value_primary+ '%'),
                                                                                                            test_result.place_of_test.like('%' +global_value_primary+ '%'),
                                                                                                            test_result.serial_number.like('%' +global_value_primary+ '%'),
                                                                                                            test_result.result.like('%' +global_value_primary+ '%'))).filter(test_result.test_details=='Overall').all()
                    return render_template('/primary_test_data.html', title='', display_test_results=display_test_results)

 elif request.form['asc'] != '':
                    order_column = request.form['asc'] ... 

AttributeError:类型对象'test_result'没有属性'order_column'

1 个答案:

答案 0 :(得分:1)

使用getattr

.order_by(desc(getattr(test_result, request.form['desc'])))