Python 可选,其中执行pymysql中的条件

Python 可选,其中执行pymysql中的条件,python,mysql,sql-injection,pymysql,Python,Mysql,Sql Injection,Pymysql,我有一个mysql SELECT查询,我想使用pymysql使用python执行。 为了避免重复,我希望该方法采用一些可选参数,这些参数应该定义SELECT是否应该将它们用作WHERE条件 最简单的例子: def select_from_db(arg1 = None, arg2 = None): db_connection = connect_to_db() cursor = db_connection.cursor() where_condition_one = ' a

我有一个mysql SELECT查询,我想使用pymysql使用python执行。 为了避免重复,我希望该方法采用一些可选参数,这些参数应该定义SELECT是否应该将它们用作WHERE条件

最简单的例子:

def select_from_db(arg1 = None, arg2 = None):
    db_connection = connect_to_db()
    cursor = db_connection.cursor()
    where_condition_one = ' and arg1 = %s'.format(arg1) if arg1 else ''
    where_condition_two = ' and arg2 = %s'.format(arg2) if arg2 else ''
    cursor.execute('SELECT * FROM tableName WHERE 1=1 ',(where_condition_one, where_condition_two)) 
    #Handle result...
问题是调用select_from_db()的结果查询是:

虽然我希望它是:

SELECT * FROM tableName WHERE 1=1
我已尝试使用“无”而不是“”,但后来我得到:

SELECT * FROM tableName WHERE 1=1 None None
有没有什么优雅的方法可以让我在不使用sql注入的情况下通过一条execute语句实现目标

sql = 'SELECT * FROM tableName WHERE 1=1 '
args = []
if arg1:
    sql += ' and arg1 = %s'
    args.append(arg1)
if arg2:
    sql += ' and arg2 = %s'
    args.append(arg2)
cursor.execute(sql, args)
或复制较少:

sql = ['SELECT * FROM tableName WHERE 1=1']
args = []

def add_arg(name, value):
    if value:
        sql.append('and {} = %s'.format(name))
        args.append(value)

add_arg('arg1', arg1)
add_arg('arg2', arg2)

cursor.execute(' '.join(sql), args)
或复制较少:

sql = ['SELECT * FROM tableName WHERE 1=1']
args = []

def add_arg(name, value):
    if value:
        sql.append('and {} = %s'.format(name))
        args.append(value)

add_arg('arg1', arg1)
add_arg('arg2', arg2)

cursor.execute(' '.join(sql), args)

%s
在pymysql中运行良好。我也测试了
,但它不起作用。谢谢Alex,我有点不好意思,我自己没有看到这个解决方案:)
%s
在pymysql中工作得很好。我也测试了
,但它不起作用。谢谢Alex,有点不好意思我自己没有看到这个解决方案:)对于动态查询构建也有。谢谢,我正在尝试避免使用ORM,因为我想控制我创建的确切SQL:)SQLAlchemy不仅仅是ORM。ORM构建在Core之上,它基本上是一个Pythonic DSL/查询构建器。好的,谢谢,我会在动态查询构建中检查它。谢谢,我试图避免使用ORM,因为我想控制我创建的确切SQL:)SQLAlchemy不仅仅是一个ORM。ORM构建在Core之上,它基本上是一个pythonicDSL/查询构建器。好的,谢谢,我来看看