用于生成SQL字符串的设计模式

时间:2012-12-22 00:59:51

标签: python sql design-patterns

我在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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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 )