我有一个蟒蛇的功能,其接收的许多变量,并建立一个SQL query出它们:

def myfunc(name=None, abbr=None, grade=None, ...)

这些价值观应该建立一个SQL query.为此目的,这些人平等 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)

是有一个更好的,更多的功能已大大增强的方式来改变内容,根据这条规则?

亚当

有帮助吗?

解决方案

,以形成一个SQL查询的最好方法是不被串格式化 - 一个execute对象的cursor方法需要一个查询字符串用占位符和一个序列(或字典,取决于确切的实现你有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是使用和占位 让司机处理的数值.都转化成空自动和正确的字符串逃避执行。

串连串是一个 坏主意.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top