使用逻辑条件连接字符串(用于SQL查询)

时间:2018-11-03 10:52:56

标签: python sql string python-3.x

我想通过连接字符串但有条件的方式来创建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不是解决方案。

1 个答案:

答案 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)。