不明白这个“SQL 语句参数不足”错误

jam*_*bcn 0 python mysql

# Import libraries\nimport os, re, subprocess, pyautogui, time, datetime, io\nimport mysql.connector\nimport csv\n\n\nconnection = mysql.connector.connect(\n    user="xxxxx", password="xxxxxx", host="192.168.0.6", database="xxx"\n)\n\ncur = connection.cursor(buffered=True)\n\ntable = "inmuebles"\n\nquery = "SELECT * FROM %s;" % table\n\ncur.execute(query)\n\nwith io.open("test.csv", "w", encoding="utf-8") as f:\n    writer = csv.writer(f, delimiter=";")\n    for row in cur.fetchall():\n        writer.writerow(row)\n\nconnection.commit()\ncur.close()\nconnection.close()\n\n\n##############\n### IMPORT ###\n##############\n\nconnection = mysql.connector.connect(\n    user="xxxxx", password="xxxxx", host="xxxxx", database="xxxx"\n)\n\ncur = connection.cursor(buffered=True)\n\nsql = "SELECT count(*) FROM inmuebles_test"\n\ntry:\n    cur.execute(sql)\n    results = cur.fetchall()\n    for row in results:\n        count = row[0]\n        print("Initially there are %d rows in table" % (count))\n\nexcept:\n    print("Error: unable to fetch data")\n\ncr = csv.reader(open("test.csv", "r", encoding="utf-8"), delimiter=";")\ni = 1\nnext(cr)\nfor row in cr:\n    print(row)\n    print("inserting row-%d into Db" % (i))\n    # cur.execute("INSERT INTO inmuebles_test VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",row)\n    # connection.commit()\n    i = i + 1\n    if i > 10:\n        break\n\ntry:\n    cur.execute(sql)\n    results = cur.fetchall()\n    for row in results:\n        count = row[0]\n        print("Finally there are %d rows in table" % (count))\n\nexcept:\n    print("Error: unable to fetch data")\n\ncur.close()\nconnection.close()\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的代码导出到 csv 文件,然后尝试将其导入到不同服务器上的相同表。

\n\n
# Import libraries\nimport os, re, subprocess, pyautogui, time, datetime, io\nimport mysql.connector\nimport csv\n\n\nconnection = mysql.connector.connect(\n    user="xxxxx", password="xxxxxx", host="192.168.0.6", database="xxx"\n)\n\ncur = connection.cursor(buffered=True)\n\ntable = "inmuebles"\n\nquery = "SELECT * FROM %s;" % table\n\ncur.execute(query)\n\nwith io.open("test.csv", "w", encoding="utf-8") as f:\n    writer = csv.writer(f, delimiter=";")\n    for row in cur.fetchall():\n        writer.writerow(row)\n\nconnection.commit()\ncur.close()\nconnection.close()\n\n\n##############\n### IMPORT ###\n##############\n\nconnection = mysql.connector.connect(\n    user="xxxxx", password="xxxxx", host="xxxxx", database="xxxx"\n)\n\ncur = connection.cursor(buffered=True)\n\nsql = "SELECT count(*) FROM inmuebles_test"\n\ntry:\n    cur.execute(sql)\n    results = cur.fetchall()\n    for row in results:\n        count = row[0]\n        print("Initially there are %d rows in table" % (count))\n\nexcept:\n    print("Error: unable to fetch data")\n\ncr = csv.reader(open("test.csv", "r", encoding="utf-8"), delimiter=";")\ni = 1\nnext(cr)\nfor row in cr:\n    print(row)\n    print("inserting row-%d into Db" % (i))\n    # cur.execute("INSERT INTO inmuebles_test VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",row)\n    # connection.commit()\n    i = i + 1\n    if i > 10:\n        break\n\ntry:\n    cur.execute(sql)\n    results = cur.fetchall()\n    for row in results:\n        count = row[0]\n        print("Finally there are %d rows in table" % (count))\n\nexcept:\n    print("Error: unable to fetch data")\n\ncur.close()\nconnection.close()\n
Run Code Online (Sandbox Code Playgroud)\n\n

即使当我导入只有两列的表时,也会发生此错误,将第 70 行更改为以下内容:

\n\n
cur.execute("INSERT INTO inmuebles_test (id, referencia) VALUES ( %s, %s )",row)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我注释掉第 70-71 行,那么下面是在第 68 行上打印的行的示例:

\n\n
Not enough parameters for the SQL statement\n
Run Code Online (Sandbox Code Playgroud)\n

Muh*_*lal 6

您需要提供与查询中使用的相同数量的参数来执行:

例如

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
Run Code Online (Sandbox Code Playgroud)

此外,参数应该是元组或字典(而不是列表),如下所述:

该方法执行给定的数据库操作(查询或命令)。在元组或字典参数中找到的参数绑定到操作中的变量。

来源: https ://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html