Подтвердить что ты не робот

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 не оценивает, что заполнители используются таким образом.

Может ли кто-нибудь указать, что здесь происходит вместе с правильным способом сделать это?

4b9b3361

Ответ 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 (`)?, в какой-то мере это объясняет, и, несмотря на мнение в этом ответе, я бы скажите, что в вашем случае цитирование - хорошая идея.