当我尝试使用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]
它引发了这个错误,这显然是逻辑上的,但是我没有成功找到解决方案:
我试图通过此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
但是我遇到了这个错误,我不明白为什么我的变量名被视为表的一列:
您能帮我吗?
谢谢
答案 0 :(得分:1)
除非您有充分的理由,否则不应在SQL语句中使用.format
。 尤其是在用户输入的情况下!。它们对SQLI来说非常容易(除非您真的很想分别进行每个转义/检查/替换)。以下是您在做什么与不应该使用.format
而不是应该做什么的示例:
不正确:
cursor.execute("SELECT * FROM x WHERE y = {}".format("customer"))
正确:
cursor.execute("SELECT * FROM x WHERE y = %s", ["customer"])