代码之家  ›  专栏  ›  技术社区  ›  Adam Matan

python:变量内容的自动更改

  •  1
  • Adam Matan  · 技术社区  · 15 年前

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

    有没有一种更好的,更多的方法来根据这个规则改变变量的内容?

    亚当

    3 回复  |  直到 15 年前
        1
  •  5
  •   Alex Martelli    15 年前

    形成SQL查询的最佳方法不是通过字符串格式——字符串格式 execute A方法 cursor 对象接受查询字符串 带占位符 以及一个序列(或dict,取决于您对db api的确切实现),其中包含要在其中替换的值;然后它将执行所需的无到空和字符串引用。

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

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

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

        2
  •  0
  •   sttwister    15 年前

    你可以定义 myfunc 如下:

    def myfunc(*args, **kwargs)
    

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

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

        3
  •  0
  •   piro    15 年前

    将参数传递给psycopg2的正确方法是使用占位符和 let the driver handle the values . 无自动转换为空,并执行正确的字符串转义。

    连接字符串是 bad idea .