Using pysqlite I am making a procedure to do something with some data. The same kind of operation is done on similar fields in multiple tables and columns, so I thought I could parameterize the sql statement as shown below:
def foo():
column = 'c'
table = 't'
row = 1
# preferred approach, gives syntax error
c.execute('SELECT ? FROM ? WHERE id=?', (column, table, row))
# sanity check, works fine
c.execute('SELECT c FROM t WHERE id=?', (row))
# workaround, also works, but is this the right way?
c.execute('SELECT % FROM % WHERE id=?' % (column, table), row))
The error I get is not very helpful (sqlite3.OperationalError: near "?": syntax error
), but I get the point: Pysqlite does not appreciate placeholders being used in this way.
Can anyone point out what is going on here along with the proper way of doing the above?
You simply can not use placeholders for column or table names. I don't have a authoritative citation for this -- I "know" this only from having tried it and from failing. It makes some sense though:
execute
-ing) the SQL statement before fetching, since all parts of the statement could be
replaced.In short, you've found the right way -- use string formating.
c.execute('SELECT {} FROM {} WHERE id=?'.format(column, table), row))
1 Not all drivers quote parameters -- oursql
doesn't, since it sends SQL and arguments to the server separately.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With