Reputation: 90
Here is my code:
import csv import mysql.connector
mydb = mysql.connector.connect( host="localhost", user="root", passwd="root", database="4g_hs_upgrade" )
mycursor = mydb.cursor()
sql = "INSERT INTO test (num) VALUES %s"
val = 'John'
mycursor.execute(sql, (val))
mydb.commit()
Here is the error I'm getting :
Traceback (most recent call last): File "csvreader.py", line 13, in mycursor.execute(sql, (val)) File "/usr/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 507, in execute self._handle_result(self._connection.cmd_query(stmt)) File "/usr/lib/python2.7/dist-packages/mysql/connector/connection.py", line 722, in cmd_query result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) File "/usr/lib/python2.7/dist-packages/mysql/connector/connection.py", line 640, in _handle_result raise errors.get_exception(packet) 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 '%s' at line 1
Upvotes: 0
Views: 2858
Reputation: 31396
Your use of %s
in the query string won't work as expected, you could follow it with % replacement_string
, but it appears you want to executemany()
and have MySQL do the replacement on the fly. This is the safer and better way to do this, so you are on the correct path.
The correct syntax:
import csv
import mysql.connector
mydb = mysql.connector.connect(host="localhost", user="root", passwd="root", database="4g_hs_upgrade")
mycursor = mydb.cursor()
sql = "INSERT INTO test (num) VALUES (%s)"
val = 'John'
mycursor.execute(sql, (val))
mydb.commit()
Note that the value 'John'
doesn't sound very logical for a column named num
, but I'm merely following your example.
You were missing the parentheses, which caused confusion because it suggested you were looking to use the Python %s
string replacement functionality, while you were probably after this: https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-transaction.html
Upvotes: 1
Reputation: 12505
mydb = mysql.connector.connect( host="localhost", user="root", passwd="root", database="4g_hs_upgrade" )
mycursor = mydb.cursor()
sql = "INSERT INTO test (num) VALUES %s" % ('John',)
mycursor.execute(sql, (val))
mydb.commit()
You must do it like this, % ('John',)
If you have a list of values you may do it like this,
values = ['John', 'address1']
sql = "INSERT INTO test (num, address) VALUES (%s)" % (','.join(values))
Upvotes: 1
Reputation:
See below. Note parentheses around the %s
in sql
. Note params
tuple, i.e., trailing comma after the single value.
sql = "INSERT INTO test (num) VALUES (%s)"
val = 'John'
params = (val,)
mycursor.execute(sql, params)
See docs for the MySQLCursor.execute() Method
Upvotes: 2