How do I use prepared statement for inserting MULTIPLE records in SQlite using Python / Django?
Asked
Active
Viewed 4.4k times
2 Answers
53
Official Python library documentation: Cursor objects
Python's SQLite libraries don't have prepared statement objects, but they do allow you to use parameterized queries, and to provide more than one set of parameters.
Edit: An example of executemany
as requested:
values_to_insert = [(1,"foo"), (2, "bar"), (3, "baz")]
cursor.executemany("""
INSERT INTO some_table ('item_num', 'item_name')
VALUES (?, ?)""", values_to_insert)

Marcus Müller
- 34,677
- 4
- 53
- 94

Amber
- 507,862
- 82
- 626
- 550
-
1@Amber: thank you for your answer. I had missed one important point i.e. it was insertion of MULTIPLE records.. "execute()" allows only one query to be execute.. so won't work for me :) – Mahendra Liya Apr 11 '11 at 05:15
-
2@mahendraliya which is why `.executemany()` exists: http://docs.python.org/library/sqlite3.html#sqlite3.Cursor.executemany – Amber Apr 11 '11 at 05:19
-
@Amber: i went through executemany() as well but sorry to say I am quite new to both python and sqlite. My doubt is like if I have, say a list of filenames which I have prepared by appending values inside a list object, then how can I use it with executeMany.. is it like simply passing the list object (say fileList) to executemany()?.. Any code snippet would be really appreciated.. thanks. – Mahendra Liya Apr 11 '11 at 05:30
-
@mahendraliya - added an example of `executemany` usage, as requested. – Amber Apr 11 '11 at 06:49
-
@Amber: your code worked very well for me.. BUT I get errors when I try to run executemany() for values having non-english characters.. this worked earlier with executescript().. I don't know why it fails with executemany()..? Do you have any idea? – Mahendra Liya Apr 12 '11 at 07:33
-
I don't know how to check for the encoding, can you please suggest how can I test it? The exact error obtained is : "sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings." – Mahendra Liya Apr 15 '11 at 06:55
-
I solved the error by using con.text_factory = str; Thanks for your all help and coming back again to the question – Mahendra Liya Apr 15 '11 at 09:59
9
You can use executemany() and pass an iterator object, e.g. to insert 100 integers and their squares:
def my_iter(x):
for i in range(x):
yield i, i*i
cursor.executemany("INSERT INTO my_table VALUES (?, ?)", my_iter(100))

flacs
- 3,913
- 4
- 19
- 20