【问题标题】:Error: 1210: Incorrect number of arguments executing prepared statement错误:1210:执行准备好的语句的参数数量不正确
【发布时间】:2018-11-07 07:26:20
【问题描述】:

我正在尝试使用 Python 将数据插入 MySQL。

这个错误的原因是什么?

ProgrammingError: 1210: 执行的参数数量不正确 准备好的语句

我的python代码:

connection = mysql.connector.connect(host='localhost',
                         database='popsww2017',
                         user='root',
                         password='')
records_to_insert = [('---2q7vcZGU', 'Partner-provided', '35', '9s1Pvm0U8Gg8mRavZhVXdg', 'A663893851990558', '1066/2016/HDHT-Pops-Kha Ly', '1467', '0.100598')]
sql_insert_query = "INSERT INTO raw_music (`Video_ID`, `Content_Type`, `Video_Duration`, `Channel_ID`, `Asset_ID`, `Asset_Labels`, `Owned_Views`, `Partner_Revenue`) VALUES ( '%s', '%s' , '%s' , '%s', '%s' , '%s' , '%s' , '%s') "
cursor = connection.cursor(prepared=True)
result  = cursor.executemany(sql_insert_query,records_to_insert)
connection.commit()

我的桌子:

Video_ID    varchar(50) utf8_unicode_ci     
Content_Type    varchar(100)    utf16_unicode_ci        
Video_Duration  int(11)         
Channel_ID  varchar(100)    utf8_unicode_ci     
Asset_ID    varchar(50) utf32_unicode_ci        
Asset_Labels    varchar(400)    utf32_unicode_ci        
Owned_Views int(20)         
Partner_Revenue float   

【问题讨论】:

  • 当回答指出问题中的错误时,习惯上不要修复问题中的错误。 否则以后的查看者(例如我; -)。我看到三个错误 (1) records_to_insert 需要是一个列表,(2) 它需要传递给 executemany(),(3) 删除 %s 符号周围的引号。是这样吗?

标签: python mysql database-connection


【解决方案1】:

使它起作用的秘诀是在单值元组的末尾添加一个逗号。

例子:

# a tuple
to_insert = ('A value to insert'**,**)

在这种情况下:

records_to_insert = [('---2q7vcZGU', 'Partner-provided', 35, '9s1Pvm0U8Gg8mRavZhVXdg', 'A663893851990558', '1066/2016/HDHT-Pops-Kha Ly', 1467, 0.100598)**,**]

它适用于单值元组。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    你忘了传递executemany method parameters

    result  = cursor.executemany(sql_insert_query,records_to_insert)
    

    MySQLCursor.executemany() 方法 语法:

    cursor.executemany(operation, seq_of_params)
    

    此方法准备一个数据库操作(查询或命令)并针对所有参数序列或在序列 seq_of_params 中找到的映射执行它。

    另外你的语法是错误的(去掉引号),改用下面的:

    records_to_insert = [('---2q7vcZGU', 'Partner-provided', '35', '9s1Pvm0U8Gg8mRavZhVXdg', 'A663893851990558', '1066/2016/HDHT-Pops-Kha Ly', '1467', '0.100598')]
    sql_insert_query = "INSERT INTO raw_music (`Video_ID`, `Content_Type`, `Video_Duration`, `Channel_ID`, `Asset_ID`, `Asset_Labels`, `Owned_Views`, `Partner_Revenue`) VALUES ( %s, %s , %s , %s, %s , %s , %s , %s) "
    cursor = connection.cursor(prepared=True)
    result  = cursor.executemany(sql_insert_query, records_to_insert)
    

    【讨论】:

    • 仍然没有得到你。我错过了什么?
    • @AnalyticsPOPSWW 您两次将sql_insert_query 发送到executemany,而不是使用records_to_insert 作为第二个参数
    • 抱歉。我的错。但即使我改变了那条线。我仍然遇到同样的错误
    • 我像你的一样改变了,但仍然出现错误 ProgrammingError: 1210: Incorrect number of arguments executed executed Prepared statement
    • 它终于起作用了:)。这些愚蠢的台词'%s', '%s' , '%s' , '%s', '%s' , '%s' , '%s' , '%s' 让我筋疲力尽。
    【解决方案3】:

    executemany 函数用于当您需要在数据库中插入许多行时。第二个参数应该是一个包含要插入这些不同行的值的列表。因此,您可以将代码修改为以下内容: (请注意,我在records_to_insert 中添加了方括号[],使其成为一个列表)

    records_to_insert = [('---2q7vcZGU', 'Partner-provided', 35, '9s1Pvm0U8Gg8mRavZhVXdg', 'A663893851990558', '1066/2016/HDHT-Pops-Kha Ly', 1467, 0.100598)]
    sql_insert_query = "INSERT INTO raw_music (`Video_ID`, `Content_Type`, `Video_Duration`, `Channel_ID`, `Asset_ID`, `Asset_Labels`, `Owned_Views`, `Partner_Revenue`) VALUES ( '%s', '%s' , %d , '%s', '%s' , '%s' , %d , %f) "
    cursor = connection.cursor(prepared=True)
    result  = cursor.executemany(sql_insert_query, records_to_insert)
    connection.commit()
    

    【讨论】:

    • 我试过像你提到的但仍然得到同样的错误
    • 只插入一行吗?
    • 如果我有一排。我可以使用execute 而不是executemany。我知道。但这根本没有帮助
    • 没有。问题是这个'%s', '%s' , %d , '%s', '%s' , '%s' , %d , %f)
    • 我明白了!谢谢!
    猜你喜欢
    • 2017-06-25
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2013-05-19
    • 2013-12-13
    • 2012-03-17
    相关资源
    最近更新 更多