使用Python和%s运算符将Excel工作表中的值添加到MySQL表中

时间:2019-07-05 09:23:34

标签: python mysql

尝试使用Python循环将工作表中的值添加到MySQL表中。

代码如下:

for i in range(number_of_columns):
    column_title=worksheet.cell(0,i).value

    for n in range(1,number_of_rows+1):

        value_for_table=worksheet.cell(n,i).value
        print n,i,column_title, value_for_table

        mycursor.execute("INSERT INTO Test (%s) VALUES (%s)", (column_title,value_for_table))

它吐出以下错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Name') VALUES ('Germany')' at line 1

我尝试解决方法here失败

编辑:

这些列最初是使用以下代码创建的:

for i in range(number_of_columns):

    column_title=worksheet.cell(0,i).value
    datatype_of_column=type(worksheet.cell(1,i).value)

    if datatype_of_column==float:
        cell_type="FLOAT(10)"
    elif datatype_of_column==int:
        cell_type="INT(10)"
    elif datatype_of_column==unicode or datatype_of_column==str:
        cell_type="VARCHAR(10)"
    elif datatype_of_column==bool:
        cell_type="BINARY"
    else:
        print ('Datatype at column %s not recognized. Set to float.', i)

    mycursor.execute("ALTER TABLE Test ADD (%s %s)" % (column_title, cell_type))

该表如下所示:XLS Table

1 个答案:

答案 0 :(得分:1)

您不能在准备好的语句中使用占位符表示列名或表名。您应该将查询执行(mycursor.execute)更改为:

query=("INSERT INTO Test (%s)" % column_title) + " VALUES (%s)"
mycursor.execute(query, (value_for_table,))

编辑

我已为您的要求修改了脚本。如您所说,脚本将为每个值创建一个新行,而不是为每一行生成一个插入语句。试试这个:

for n in range(1,number_of_rows+1):

    value_for_table=worksheet.cell(n,i).value
    query="INSERT INTO Test ("
    query_values="("
    values=[]
    for i in range(number_of_columns):
        column_title=worksheet.cell(0,i).value
        value_for_table = worksheet.cell(n, i).value
        query=query+column_title if i==0 else query+','+column_title
        query_values=query_values+"%s" if i==0 else query_values+',%s'
        values.append(value_for_table)
    query=query+') VALUES '+query_values+')'
    mycursor.execute(query, values)