string.format引号在变量中转义

时间:2019-07-15 04:34:09

标签: python-3.x string format

当我尝试使用psycopg2游标从Postgres数据库检索数据时遇到问题。 我正在使用string.format在游标查询中传递变量名,但是只要名称包含单引号,该引号就不会被转义,并且会引发错误。

这是我的python代码:

def getFirstOrderDate(exact_hotel_name):

    ## Retrieve the first order date to know how old is the property ##

    con=psycopg2.connect(dbname=dbname(),host=host(),port=port(),user=user(),password=password())
    cur=con.cursor()
    firstOrderTxt="Select hotel_name,exact_hotel_name,min(order_date) from fact.podio_orders where exact_hotel_name = '{}' group by hotel_name,exact_hotel_name".format(str(exact_hotel_name))
    cur.execute(firstOrderTxt)
    firstOrder=cur.fetchall()
    cur.close()
    con.close()
    return firstOrder[0][2]

它引发了这个错误,这显然是逻辑上的,但是我没有成功找到解决方案: enter image description here

我试图通过此firstOrderTxt='Select hotel_name,exact_hotel_name,min(order_date) from fact.podio_orders where exact_hotel_name = "{}" group by hotel_name,exact_hotel_name'.format(exact_hotel_name)修改firstOrderTxt 但是我遇到了这个错误,我不明白为什么我的变量名被视为表的一列: enter image description here

您能帮我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

除非您有充分的理由,否则不应在SQL语句中使用.format尤其是在用户输入的情况下!。它们对SQLI来说非常容易(除非您真的很想分别进行每个转义/检查/替换)。以下是您在做什么与不应该使用.format而不是应该做什么的示例:

不正确:

cursor.execute("SELECT * FROM x WHERE y = {}".format("customer"))

正确:

cursor.execute("SELECT * FROM x WHERE y = %s", ["customer"])