Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python MySQLdb WHERE SQL LIKE

I have recently started to learn Python and MySQL for web purposes and I have run into a following problem :

I want to pull out from a mysql database one record that contains any text that I enter in param section, howerver I am running into following problem when making a query:

traceback (most recent call last):
  File "/Users/Strielok/Desktop/test.py", line 13, in <module>
    c.execute("SELECT * FROM data WHERE params LIKE ('%s%') LIMIT 1"  % (param))
TypeError: not enough arguments for format string

Here is my code:

import MySQLdb



db = MySQLdb.connect (host = "localhost",
                          user = "root",
                          passwd = "root",
                          db = "test")
param = "Test"

par = param

c = db.cursor()

c.execute("SELECT * FROM data WHERE params LIKE ('%s%') LIMIT 1"  % (param))


data = c.fetchall()
print data

c.close()

Thanks in advance.

like image 686
Michał Lach Avatar asked Mar 02 '26 00:03

Michał Lach


2 Answers

Directly inserting the data into the SQL string is not the best way to do this, as it is prone to SQL injection. You should change it to this:

c.execute("SELECT * FROM data WHERE params LIKE %s LIMIT 1", ("%" + param + "%",))

like image 63
univerio Avatar answered Mar 04 '26 12:03

univerio


A better aproach (and safer), instead to use a string as "%" + param + "%" would be to escape % char in template string with another % (so, %%), so it'll be:

c.execute("SELECT * FROM data WHERE params LIKE '%%%s%%' LIMIT 1", (param,))

like image 33
Alisson R. Perez Avatar answered Mar 04 '26 12:03

Alisson R. Perez