1

我在 python 模块中有以下方法,它采用所有默认参数,并通过以下方式从这些参数生成 SQL 查询:

想知道,是否有更好(优雅和 Pythonic)的方式来生成上述 SQL 查询

def myquery(arg1=None, arg2=None, arg3=None):
    query = "SELECT column FROM table WHERE"
    params = []
    if arg1 is not None:
        query = query + " arg1 = " + arg1
        params.append(arg1)

    if arg2 is not None:
        if params is not None:
            query = query + "AND arg2 = " + arg2
        else:
            query = query + " arg 2 = " + arg2
        params.append(arg2)

    if arg3 is not None:
        if params is not None:
            query = query + "AND arg3 = " + arg3
        else:
            query = query + " arg 3 = " + arg3
        params.append(arg3)
    return query
4

2 回答 2

3

如果我要在没有 ORM 的情况下这样做,我会做类似的事情

def QueryWhere(table,where={}):
    params = ["%s=?"%key for key in where.keys()] #take advantage of builtin query placeholders (?)
    c = db.cursor()
    c.execute("SELECT * FROM %s WHERE %s"%(table," AND ".join(params)),where.values())
    return c.fetchall()

print QueryWhere("users",{"name":"johndoe","pass":"1c4$g"}) 

无论如何都是这样的......我还建议考虑使用 ORM

于 2012-12-22T01:41:04.927 回答
0

您的代码存在(我认为是)一些小问题(AND 之前的间距,如果使用单个 arg2/arg3 参数调用函数,则会出现错误结果等)。因此,我正在回答这个问题,因为我相信该功能应该表现良好 - 请随时纠正我。

我认为最 Pythonic 的方法是使用字典而不是函数参数 - 如果你愿意,你可以使用参数字典来公开与现在相同的函数行为。此外,使用迭代、列表推导和字符串格式化还有很多好处:

def myquery2(**args):
    query = "SELECT column FROM table WHERE"
    options= [" {0} = {1}".format(arg, value) for arg,value in args.iteritems()]
    return query + " AND".join( options )
于 2012-12-22T01:42:58.283 回答