【问题标题】:psycopg2 Programming Error when using .format()使用 .format() 时出现 psycopg2 编程错误
【发布时间】:2018-07-20 16:40:25
【问题描述】:

我不确定这里到底发生了什么,但它可能与 python 中的格式有关。 运行它会导致错误。

x = '00000201000012EB'
sql = """ SELECT * FROM table WHERE id = {} """.format(x)
conn.execute(sql)

我收到一条错误消息:“EB”附近的语法错误

但是当我像这样运行命令时:

sql = """ SELECT * FROM table WHERE id = '00000201000012EB' """
conn.execute(sql)

效果很好。

我格式化这条sql语句的方式有问题吗?

【问题讨论】:

    标签: python postgresql python-3.5 psycopg2 string.format


    【解决方案1】:

    使用变量作为execute()的参数:

    cur.execute(""" SELECT * FROM my_table WHERE id = %s """, (x,))
    

    如果你确定使用format(),你应该在占位符周围加上单引号:

    sql = """ SELECT * FROM my_table WHERE id = '{}' """.format(x)
    

    【讨论】:

    • 我喜欢!我使用 .format 的原因是因为输入发生了变化,我只是将其作为一个更简单的示例。很好的回答先生
    • 这两个选项在某种程度上相似,但通常execute() 带有参数在潜在的 SQL 注入上下文中更安全一些。参见例如psycopg2 and SQL injection security.
    • 我对SQL注入了解不多,但如果你说第一个选项更安全,我会修改我的代码=)
    【解决方案2】:

    信不信由你通过在字符串中添加更多引号来修复它。

    这终于奏效了。

    x = '00000201000012EB'
    sql = """ SELECT * FROM table WHERE id = {} """.format("'" + x + "'")
    

    由于 sql 语句需要另一组引号,我只是添加了它们以确保将其视为自己的字符串。

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多