Pysqlite: замена подстановки для имен столбцов или таблиц?
Используя pysqlite, я делаю процедуру, чтобы сделать что-то с некоторыми данными. Такая же операция выполняется в похожих полях в нескольких таблицах и столбцах, поэтому я подумал, что могу параметризовать оператор sql, как показано ниже:
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))
Ошибка, которую я получаю, не очень полезна (sqlite3.OperationalError: near "?": syntax error
), но я получаю следующее: Pysqlite не оценивает, что заполнители используются таким образом.
Может ли кто-нибудь указать, что здесь происходит вместе с правильным способом сделать это?
Ответы
Ответ 1
Вы просто не можете использовать заполнители для имен столбцов или таблиц. У меня нет авторитетной цитаты для этого - я "знаю" это только из-за того, что пробовал это и от неудачи. Это имеет смысл, хотя:
- Если параметры столбца и таблицы могут быть параметризованы, будет мало
(
execute
-ing) SQL-запрос перед извлечением, так как все части инструкции могут быть
заменить.
- Я не уверен в pysqlite 1 но MySQLdb автоматически цитирует все
строковые параметры. Имена столбцов и таблиц не должны указываться. Так что
усложнит разбор, требуемый водителем, если он должен был
решить, имеет ли местозаполнитель имя столбца или таблицы в сравнении с
значение, которое требуется для цитирования.
Короче говоря, вы нашли правильный путь - используйте форматирование строк.
c.execute('SELECT {} FROM {} WHERE id=?'.format(column, table), row))
1 Не все параметры кавычек драйверов - oursql
нет, поскольку он отправляет SQL и аргументы на сервер отдельно.
Ответ 2
Как ответил @unutbu, нет способа использовать заполнители для имен таблиц и столбцов. Мое предложение делать то, что вы делаете сейчас, но также указывать имена таблиц, чтобы защитить себя от таблицы или столбца, у которого может быть нечетное имя.
Что говорит SQL Standard об использовании backtick (`)?, в какой-то мере это объясняет, и, несмотря на мнение в этом ответе, я бы скажите, что в вашем случае цитирование - хорошая идея.