sukovanej
sukovanej

Reputation: 688

Python - MySQLdb parametrized query

I'm trying to create a simple script for changing some mysql data, but I'm little bit confused about parametrized queries. The code look like this:

reader_id = sys.argv[1]
cmd_id = sys.argv[2]

conn = mysql.connect(user='...', passwd='...', host='...', db='...')
curs = conn.cursor()

mysql_data = {
    "reader_id": int(reader_id),
    "cmd_id": int(cmd_id)
}

curs.execute("UPDATE `reader_config_hw` SET `changed_` = '1' "
             "WHERE `object_id` = %(reader_id)d AND `id` = %(cmd_id)d;", mysql_data)

curs.execute("UPDATE `reader` SET `check_for_command` = '1' WHERE `id` = %(reader_id)d", mysql_data)

and the error result is

Traceback (most recent call last):
  File "./main.py", line 25, in <module>
    "WHERE `object_id` = %(reader_id)d AND `id` = %(cmd_id)d;", mysql_data)
  File "/usr/lib64/python3.6/site-packages/MySQLdb/cursors.py", line 210, in execute
    query = query % args
TypeError: %d format: a number is required, not str

It says that number is required but I already changed the type of the variable by int(reader_id), is it right?

Upvotes: 0

Views: 142

Answers (1)

nat5142
nat5142

Reputation: 495

Try changing "WHERE 'object_id' = %(reader_id)d AND 'id' = %(cmd_id)d;"

to

"WHERE 'object_id' = %(reader_id)s AND 'id' = %(cmd_id)s;"

I think the 'd' after your variable calls indicates a "digit" whereas you need to use a string.

EDIT: to clarify, strings can be used in place of integers in MySQL queries

Upvotes: 1

Related Questions