我想通过连接字符串但有条件的方式来创建SQL查询。
qs_str= 'Select *, from items ...'
条件:
if active:
qs_str = ' '.join([qs_str, f'WHERE active=true'])
if is_parent:
qs_str = ' '.join([qs_str, f'WHERE parent=true'])
if limit:
qs_str = ' '.join([qs_str, f'WHERE LIMIT={limit}'])
.....
对于多少个条件并没有固定的限制。
问题是WHERE
子句,应该只添加一次(如果没有条件则不添加),以及如何添加AND
才能知道条件是否已经存在。
因为理论上我不能满足的条件数量没有限制
使用组合ifs
之类的is_active and is_parent
不是解决方案。
答案 0 :(得分:1)
您可以将条件收集在列表中,然后仅在列表非空时才附加“ where”子句。
使用' and '.join(conditions)
可以轻松地根据需要轻松地添加“和”。
def create_item_query(active=True, is_parent=True, limit=10):
qs_str= 'select * from items'
conditions = []
if active:
conditions.append('active=true')
if is_parent:
conditions.append('parent=true')
if limit:
conditions.append('LIMIT={limit:d}'.format(limit=limit))
if conditions:
qs_str += 'where ' + ' and '.join(conditions)
return qs_str
print(create_item_query(True, True, 10))
print(create_item_query(True, False, None))
print(create_item_query(False, False, None))
编辑:我应该指出,正如Patrick Artner在他的评论中提到的那样,由于SQL injection的危险,将SQL查询构建为字符串实际上不是一个好习惯。然后,如何创建查询的确切方法取决于您使用的确切SQL库(流行的工具是SQLAlchemy)。