我正在构建一个函数,该函数用于使用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函数。
谢谢