variable expansion with sqlite
Tim Golden
mail at timgolden.me.uk
Wed Jul 30 08:09:00 EDT 2008
marc wyburn wrote:
> Hi I'm using SQlite and the CSV module and trying to create a class
> that converts data from CSV file into a SQLite table.
>
> My script curently uses functions for everything and I'm trying to
> improve my class programming. The problem I'm having is with variable
> expansion.
>
> self.cursor.executemany('INSERT INTO test VALUES (?)', CSVinput)
>
> If CSVinput is a tuple with only 1 value, everything is fine. If I
> want to use a tuple with more than 1 value, I need to add more
> question marks. As I'm writing a class I don't want to hard code a
> specific number of ?s into the INSERT statement.
>
> The two solutions I can think of are;
> using python subsitution to create a number of question marks, but
> this seems very dirty
> or
> finding someway to substitue tuples or lists into the statement - I'm
> not sure if this should be done using Python or SQLite substitution
> though.
I do this kind of thing sometimes:
<test.csv>
a,b,c
1,2,3
4,5,6
</test.csv>
<code>
import csv
import sqlite3
reader = csv.reader (open ("test.csv", "rb"))
csv_colnames = reader.next ()
db = sqlite3.connect (":memory:")
coldefs = ", ".join ("%s VARCHAR (200)" % c for c in csv_colnames)
db.execute ("CREATE TABLE test (%s)" % coldefs)
insert_cols = ", ".join (csv_colnames)
insert_qmarks = ", ".join ("?" for _ in csv_colnames)
insert_sql = "INSERT INTO test (%s) VALUES (%s)" % (insert_cols, insert_qmarks)
db.executemany (insert_sql, list (reader))
for row in db.execute ("SELECT * FROM test"):
print row
</code>
Obviously, this is a proof-of-concept code. I'm (ab)using
the convenience functions at database level, I'm hardcoding
the column definitions, and I'm making a few other assumptions,
but I think it serves as an illustration.
Of course, you're only a few steps away from something
like sqlalchemy, but sometimes rolling your own is good.
TJG
More information about the Python-list
mailing list