我在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
答案 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 )