Проблема расширения параметров Python sqlite - PullRequest
0 голосов
/ 10 марта 2011

У меня есть таблица с тремя столбцами, cell, trx и type. Это запрос, который я пытаюсь выполнить:

db.execute("SELECT cell,trx FROM tchdrop").fetchall()

Дает правильный вывод.

Однако, когда я пытаюсь a = ("cell", "trx"), а затем

db.execute("SELECT ?,? FROM tchdrop", t).fetchall()

вывод [(u'cell', u'trx'), (u'cell', u'trx')] (что неверно)

Я делаю это, чтобы понять, как динамически извлекать столбцы, что является частью большой проблемы.

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Заполнитель (?) Python DB-API (например, sqlite3) не поддерживает имена столбцов для передачи, поэтому вы должны использовать форматирование строки Python следующим образом:

a = ("cell", "trx")

query = "SELECT {0},{1} FROM tchdrop".format(*a)
db.execute(query)

EDIT:

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

a = ("cell", "trx", "foo", "bar")
a = ", ".join(a)

query = "SELECT {0} FROM tchdrop".format(a)
# OUTPUT : 'SELECT cell, trx, foo, bar FROM tchdrop'
db.execute(query)
0 голосов
/ 10 марта 2011

Библиотека заменяет указанные значения ("cell", "trx") их эквивалентами SQL в кавычках, поэтому вы получите SELECT "cell", "trx" FROM tchdrop.Результат правильный.

То, чего вы пытаетесь достичь, невозможно с синтаксисом ?.Вместо этого сделайте замену строки самостоятельно.Вы можете проверить имена столбцов с помощью регулярных выражений (например, ^[a-zA-Z_]$) для большей безопасности.

Например:

columns = ",".join(("cell", "trx"))
db.execute("SELECT %s FROM tchdrop" % columns).fetchall()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...