我无法执行以下语句,我一直得到SQL语法错误。根据所有的例子,我可以找到这应该工作
任何帮助都将非常感激。
d2 = df.iloc[-1,:]
q = symbol+'_ivol'
query = """SELECT close FROM %s WHERE date = %s"""
VALUES= (q, d2[1])
cursor.execute(query, VALUES)
ivol = cursor.fetchall()
conn.close()
SQL中的查询参数不仅仅是字符串替换。不能对表标识符使用查询参数。参数只能在通常使用带引号的字符串字面值或数字字面值的地方使用。
换句话说,在准备查询字符串之前,必须在查询字符串中固定所有标识符,因为在准备阶段必须验证标识符,以确保表是有效的标识符,并且表存在。在准备好查询之后,不能传递表标识符的名称。
不幸的是,Python驱动程序使这更令人困惑,因为它使用%s
而不是MySQL自己的?
符号作为参数占位符。这使得开发人员很自然地认为%s
只是简单的字符串替换,就像Python字符串格式化一样。
有%s
和%s
,它们的处理方式不同。我知道,这很令人困惑。
所以您可以做一个简单的字符串格式替换,将您的表放入查询字符串中:
query = """SELECT close FROM %s WHERE date = %%s""".format(q)
但是对于现代Python来说使用f-string格式更习惯:
query = f"""SELECT close FROM `{q}` WHERE date = %s"""
我在表名周围加上了反勾号,以防它是SQL保留关键字或其他什么。
那么另一个%s
是一个实际的查询参数,因为它在SQL表达式中作为标量值工作。在这个查询中,只有一个查询参数。
VALUES= [ d2[1] ]
cursor.execute(query, VALUES)