通过串联或使用字符串调用python方法

时间:2019-06-16 18:44:38

标签: python sqlite sqlalchemy

我正在构建一个函数,该函数用于使用SQLAlchemy查询数据库中的表。

让我们说我想构建一个查询,该查询返回表中的所有条目,这些表的名称为player_id为1的元素。为此,我将使用以下代码:

engine = create_engine('sqlite:///' + DATABASE_PATH) 

metadata = MetaData()
connection = engine.connect()

table = Table('elements', metadata, autoload = True, autoload_with=engine)

s = select([table]).where(table.c.player_id == 1)

但是数据库有很多列,我希望能够构建查询以便基于作为参数传递给函数的列名返回行。

下面是当前函数:

def query_table(table, filters):

    engine = create_engine('sqlite:///'+DATABASE_PATH) 

    metadata = MetaData()
    connection = engine.connect()
    tables = engine.table_names()

    table = Table(table, metadata, autoload = True, autoload_with=engine)

    for att in filters:
        attribute = att[0]
        parameter = att[1]
        operation_type = att[2]
        if operation_type == 'equal':
            s = select([table]).where(table.c.attribute == parameter)
        elif operation_type == 'greater than':
            s = select([table]).where(table.c.attribute > parameter)
        elif operation_type == 'greater than equal':
            s = select([table]).where(table.c.attribute >= parameter)
        elif operation_type == 'less than':
            s = select([table]).where(table.c.attribute < parameter)
        elif operation_type == 'less than equal':
            s = select([table]).where(table.c.attribute <= parameter)
        else:
            print('Operation type not valid')

    str(s)
    r = connection.execute(s)
    return r.fetchall()

我的问题是,基于从函数作为参数传递的字符串,调用需要动态处理的方法的最佳方法是什么?例如,下面是三个示例:

player_id是在函数中作为参数传递的列名。

s = select([table]).where(table.c.player_id == parameter)

player_name是在函数中作为参数传递的列名。

s = select([table]).where(table.c.player_name == parameter)

assist是在函数中作为参数传递的列名。

s = select([table]).where(table.c.assists == parameter)

我可以通过将整行作为字符串传递来使用eval函数来执行此操作,但是据我所读,由于安全问题,不应使用eval函数。

谢谢

0 个答案:

没有答案