我可以推荐以下选项:
1)我将直接在查询中嵌入查询参数,然后我将作为元组/字典单独传递给 cursor.execute(请参阅您的 db api 以了解确切的格式)方法:
app_phone = 5555555555
query_string="""SELECT biz_name, biz_addr, biz_owner
FROM business_t
WHERE regexp_replace(biz_phone_1, E'\\\\D|^1', '', 'g') = '%(phone)s'
OR regexp_replace(biz_phone_2, E'\\\\D|^1', '', 'g') = '%(phone)s'
OR regexp_replace(biz_cell_1, E'\\\\D|^1', '', 'g') = '%(phone)s'
OR regexp_replace(biz_cell_2, E'\\\\D|^1', '', 'g') = '%(phone)s';
"""
result = run_query(query_string, {'phone': app_phone})
该解决方案将使您免受(大多数)sql注入攻击
2) 要构建查询,您可以考虑使用 sql 查询构建库 ( https://pypi.python.org/pypi/python-sql/0.2 )。这将允许您根据表达式构建 SQL 查询,而不是使用字符串编辑。不确定此查询生成器是否支持在 where 中使用正则表达式
3)您可以尝试使用循环,但它是否变得更具可读性的问题将是主观的,恕我直言:
app_phone = 5555555555
cmp_phones = "regexp_replace(%s, E'\\\\D|^1', '', 'g') = '%%(phone)s'"
db_phone_columns = (biz_phone_1, biz_phone_2, biz_cell_1, biz_cell_2)
where_condition = 'OR'.join(cmp_phones % phone for phone in db_phone_columns)
result = run_query(query_string, {'phone': app_phone}
query_string="""SELECT biz_name, biz_addr, biz_owner
FROM business_t
WHERE %(where_condition)s;""" %
{'where_condition': where_condition}
result = run_query(query_string, {'phone': app_phone})
我个人认为解决方案 1) 最易读
4) 使用以电话为参数的存储过程
5) 示例中演示了我个人喜欢的查询字符串中的查询格式