Mandatory Programmer Mandatory Programmer - 1 month ago 11
Python Question

Python MySQLdb TypeError: not all arguments converted during string formatting

So I think I'm going crazy but upon running this script:

#! /usr/bin/env python
import MySQLdb as mdb
import sys

class Test:
def check(self, search):
try:
con = mdb.connect('localhost', 'root', 'password', 'recordsdb');

cur = con.cursor()
cur.execute( "SELECT * FROM records WHERE email LIKE '%s'", search )

ver = cur.fetchone()

print "Output : %s " % ver

except mdb.Error, e:

print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)

finally:
if con:
con.close()

test = Test()
test.check("test")


I get an error of:

./lookup
Traceback (most recent call last):
File "./lookup", line 27, in <module>
test.check("test")
File "./lookup", line 11, in creep
cur.execute( "SELECT * FROM records WHERE email LIKE '%s'", search )
File "/usr/local/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 187, in execute
query = query % tuple([db.literal(item) for item in args])
TypeError: not all arguments converted during string formatting


I have zero idea why, I'm trying to do parameterized querys but it's been nothing but a pain. I'm somewhat new to python so it's probably an obvious problem.

Answer

Instead of this:

cur.execute( "SELECT * FROM records WHERE email LIKE '%s'", search )

Try this:

cur.execute( "SELECT * FROM records WHERE email LIKE '%s'", [search] )

See the MySQLdb documentation. The reasoning is that execute's second parameter represents a list of the objects to be converted, because you could have an arbitrary number of objects in a parameterized query. In this case, you have only one, but it still needs to be an iterable (a tuple instead of a list would also be fine).

Comments