Reputation: 75
I am trying to dynamically insert into a sqlite database from python. Here is my code:
for person in people:
db.execute("INSERT INTO students (first, middle, last, house, birth) VALUES (?, ?, ?, ?, ?)", (person[0], person[1], person[2], person[3], person[4])
Python is returning the error:
File "import.py", line 34, in <module>
db.execute("INSERT INTO students (first, middle, last, house, birth) VALUES (?, ?, ?, ?, ?);", (person[0], person[1], person[2], person[3], person[4]))
File "/usr/local/lib/python3.7/site-packages/cs50/sql.py", line 21, in decorator
return f(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/cs50/sql.py", line 186, in execute
raise RuntimeError("more placeholders ({}) than values ({})".format(_placeholders, _args))
RuntimeError: more placeholders (?, ?, ?, ?, ?) than values ('Adelaide', 'NULL', 'Murton', 'Slytherin', 1982)
It works when I just run a normal query outside of python. Any help would be much appreciated.
Upvotes: 0
Views: 4082
Reputation: 59
I don't know if my answer could still be of help after about 2 years.
For your code, python sees the placeholder values i.e (person[0], person[1], ... person[4]) as a single value.
Use instead:
for person in people:
db.execute("INSERT INTO students (first, middle, last, house, birth) VALUES (?, ?, ?, ?, ?)", person[0], person[1], person[2], person[3],
person[4])
Upvotes: 1
Reputation: 75
Also I think you might need to get rid of the parenthesis here (person[0], person1, person[2], person[3], person[4]) This fixed it! Thanks Sebastien
Updated code which works:
insert_query = "INSERT INTO students (first, middle, last, house, birth) VALUES (?, ?, ?, ?, ?)"
for person in people:
db.execute(insert_query, person[0], person[1], person[2], person[3], person[4])
Upvotes: 4