Python:变量内容的自动更改

Ada*_*tan 1 python variables psycopg2

我有一个Python函数,它接收许多变量,并从中构建一个SQL查询:

def myfunc(name=None, abbr=None, grade=None, ...)
Run Code Online (Sandbox Code Playgroud)

这些值应构建SQL查询.为此目的,那些平等的人None应该改为NULL,而存储有用价值的人应该接受's:

name="'"+name+"\'" if name else 'NULL'
abbr="'"+abbr+"\'" if abbr else 'NULL'
...
Lots of lines here - that's my problem!
...
Run Code Online (Sandbox Code Playgroud)

然后,

query="""INSERT INTO table(name, abbr, ...)
         VALUES (%(name)s, %(abbr)s, ...) """ locals()
cur.execute(query)
Run Code Online (Sandbox Code Playgroud)

是否有更好的,更Pythonic方式根据此规则更改变量内容?

亚当

Ale*_*lli 5

形成SQL查询的最佳方法不是通过字符串格式化 - 对象的execute方法cursor采用带有占位符的查询字符串和序列(或dict,具体取决于您对DB API的具体实现)以及值替代那里; 然后它将执行您需要的None-to-Null和字符串引用.

我强烈建议你研究一下这种可能性.但是,如果您需要字符串处理用于其他目的,您可以执行以下操作:

processed = dict((n, "'%s'" % v if v is not None else 'NULL')
                 for n, v in locals().iteritems())
Run Code Online (Sandbox Code Playgroud)

然后使用字典processed而不是locals()进一步的字符串格式.

  • @Adam,例如,对于与Python的捆绑在标准库的源码,看到http://docs.python.org/library/sqlite3.html?highlight=sqlite#sqlite3.Cursor.execute - 其他DB API适配器使用与'?'不同的标记,例如MySQLDB中的'%s'等. (2认同)