Python, SQL: установить столбцы читать как параметр - PullRequest
1 голос
/ 09 декабря 2010

У меня есть SQL-запрос, безумный в Python, использующий Psycopg2 .Запрос читает некоторые столбцы из таблицы arches:

rows = archesDB.read_all("""SELECT "+str(columns)[1:-1].replace("'","")+" 
                           FROM arches 
                           WHERE lower(arch) like '%%%s%%'""" % (arch.lower()))

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

Наивный способ - SELECT * и отфильтровать нужные мне столбцы.Но это обременяет БД и сеть ненужными данными, поэтому я скорее избегаю этого.

Есть идеи?

Адам

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

Имена столбцов не могут передаваться в строке SQL как параметры в API БД. И это тоже не имело бы смысла.

Если вам необходимо проверить ввод имени столбца, предварительно очистите его.

Подобная строка должна быть указана в качестве параметра, хотя

Следующий пример кода будет лучше, если переменная columns содержит список строк для имен столбцов:

rows = archesDB.read_all("""SELECT %s 
                       FROM arches 
                       WHERE lower(arch) like %%s""" % (",".join(columns),),
                       ("%%%s%%" % (arch.lower(),),))

Сначала имена столбцов вставляются в первую подстановку (% s), а последние %% s преобразуются в% s. Затем ("%%% s %%"% (arch.lower (),),) создает строку с% string_content%. И, наконец, db api экранирует% string_content% и добавляет к нему кавычки, которые в итоге делают запрос.

0 голосов
/ 09 декабря 2010

Вы не можете параметризовать метаданные. Создайте сопоставление некоторого идентификатора с требуемым списком полей и используйте его.

...