[英]Python: automated change in variable contents
我有一个Python函数,该函数接收大量变量,并根据它们构建一个SQL查询:
def myfunc(name=None, abbr=None, grade=None, ...)
这些值应建立一个SQL查询。 为此,这些谁等于None
应更改为NULL
,和那些谁保存有用的值应该与拥抱'
S:
name="'"+name+"\'" if name else 'NULL'
abbr="'"+abbr+"\'" if abbr else 'NULL'
...
Lots of lines here - that's my problem!
...
然后,
query="""INSERT INTO table(name, abbr, ...)
VALUES (%(name)s, %(abbr)s, ...) """ locals()
cur.execute(query)
是否有更好的,更Python化的方法来根据此规则更改变量内容?
亚当
形成SQL查询的最佳方法不是通过字符串格式设置- cursor
对象的execute
方法采用带有占位符和序列(或dict,具体取决于您对DB API的确切实现)的查询字符串,并带有在那里替代的价值; 然后它将执行所需的从无到空和字符串引用。
我强烈建议您研究这种可能性。 但是,如果出于其他目的需要字符串处理,则可以执行以下操作:
processed = dict((n, "'%s'" % v if v is not None else 'NULL')
for n, v in locals().iteritems())
然后使用字典processed
而不是locals()
进行进一步的字符串格式化。
您可以如下定义myfunc
:
def myfunc(*args, **kwargs)
其中kwargs是一个字典,其中包含所有传递给函数的命名参数。
要获取查询参数的值,可以使用kwargs.get(name_of_parameter, 'NULL')
。 要构建查询,您只需遍历所有字典项。 但是请注意,如果以此方式进行操作,则任何作为命名参数传递给函数的参数都将最终出现在查询中。
将参数传递给psycopg2的正确方法是使用占位符,并让驱动程序处理这些值 。 没有一个将自动转换为NULL,并且执行了正确的字符串转义。
连接字符串不是一个好主意 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.