Python中的SQL语句有什么问题?

Python中的SQL语句有什么问题?,python,mysql,pandas,Python,Mysql,Pandas,我正在使用Python和MySQL数据库,并试图通过CSV文件中的行进行写入,然后将它们插入到我的数据库中。我有以下资料: import mysql.connector import pandas as pd mydb = mysql.connector.connect( host="localhost", user="root", passwd="root", database="mydb&

我正在使用Python和MySQL数据库,并试图通过CSV文件中的行进行写入,然后将它们插入到我的数据库中。我有以下资料:

import mysql.connector
import pandas as pd

mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    passwd="root",
    database="mydb")

cursor = mydb.cursor()
cursor.execute("SET FOREIGN_KEY_CHECKS=0")
csv_data = pd.read_csv("file path")
sql = "INSERT INTO table (ID, SecondID, StartDate, EndDate) VALUES (%s, %s, %s, %s)"
for index, row in csv_data.iterrows():
    cursor.execute(sql, row)
cursor.execute("SET FOREIGN_KEY_CHECKS=1")
mydb.commit()
cursor.close()
mydb.close()
我看不出SQL有什么问题。 获取以下错误:

您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在“%s,%s,%s,%s”附近

注意-如果我插入特定值,代码的其余部分似乎可以正常工作,SQL也可以正常工作,但当我尝试使用%s构造时,它失败了,我看到的其他响应似乎建议使用正确的语法


请帮助-我做错了什么?我认为您最好使用pandas to\u sql函数。
我不确定
mysql.connector是否有效,所以我将使用
sqlalchemy

看起来是这样的:

ENGINE = sqlalchemy.create_engine('mysql+pymysql://root:root@localhost:3306/mydb')
with ENGINE.connect() as connection:
    ENGINE.execute("SET FOREIGN_KEY_CHECKS=0")
    csv_data.to_sql('table_name', connection, if_exists='append', index=False)
    ENGINE.execute("SET FOREIGN_KEY_CHECKS=1")


看起来问题在于调用查询时没有对值进行scape

execute
函数用于获取类而不是数组

for index, row in csv_data.iterrows():
    cursor.execute(sql, row)
您应该生成一个包含所有值的数组,然后调用查询

比如:

for index, row in csv_data.iterrows():
    params = map(lambda x : x.value, row)
    cursor.execute(sql,params)
请小心,数组的大小必须与参数值的大小相同。
在本例中,4

谢谢您,这非常有帮助,我做了一个小改动,现在效果非常好。以下是我使用的最终解决方案:

import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine('mysql+pymysql://root:root@localhost:3306/mydb')

csv_data = pd.read_csv("file path")
engine.execute("SET FOREIGN_KEY_CHECKS=0")

with engine.connect() as connection:
    csv_data.to_sql('table', connection, if_exists='append', index=False)

engine.execute("SET FOREIGN_KEY_CHECKS=1")

值得检查一下您使用的是什么。您的桌子真的被称为“桌子”吗?这是允许的吗?无论如何,为什么%s没有任何变量?例如“%s”%(string)@sygneto语句参数就是这样工作的。如果您的表确实命名为table,则表名必须由backtics引用