1

我有一个 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)

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

亚当

4

3 回答 3

5

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

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

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

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

于 2010-01-31T17:54:44.507 回答
0

您可以定义myfunc如下:

def myfunc(*args, **kwargs)

其中 kwargs 是一个字典,其中包含传递给函数的所有命名参数。

要获取查询参数的值,您可以使用kwargs.get(name_of_parameter, 'NULL'). 要构建查询,您只需遍历所有字典项。但是请注意,如果您这样做,作为命名参数传递给函数的任何参数都将在查询中结束。

于 2010-01-31T17:57:30.910 回答
0

将参数传递给 psycopg2 的正确方法是使用占位符并让驱动程序处理这些值。None 会自动转换为 NULL 并执行正确的字符串转义。

连接字符串是个坏主意

于 2010-02-16T10:34:40.017 回答