Python: автоматическое изменение содержимого переменных - PullRequest
1 голос
/ 31 января 2010

У меня есть функция Python, которая получает множество переменных и строит из них SQL-запрос:

def myfunc(name=None, abbr=None, grade=None, ...)

Эти значения должны формировать запрос SQL. Для этого Те, кто равен None, должны быть изменены на NULL, а те, кто хранит полезные значения, должны быть приняты с ' s:

name="'"+name+"\'" if name else 'NULL'
abbr="'"+abbr+"\'" if abbr else 'NULL'
...
Lots of lines here - that's my problem!
...

А чем,

query="""INSERT INTO table(name, abbr, ...)
         VALUES (%(name)s, %(abbr)s, ...) """ locals()
cur.execute(query)

Есть ли более приятный, более питонский способ изменения содержимого переменной в соответствии с этим правилом?

Адам

Ответы [ 3 ]

5 голосов
/ 31 января 2010

Лучший способ сформировать SQL-запрос - это не форматирование строки - метод execute объекта cursor принимает строку запроса с заполнителями и последовательность (или dict, в зависимости от на точной реализации у вас есть API БД) со значениями для замены там; Затем он выполнит необходимые вам None-to-Null и строковые кавычки.

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

processed = dict((n, "'%s'" % v if v is not None else 'NULL')
                 for n, v in locals().iteritems())

и затем используйте словарь processed вместо locals() для дальнейшего форматирования строки.

0 голосов
/ 16 февраля 2010

Правильный способ передачи аргументов в psycopg2 - использовать заполнители и позволяет драйверу обрабатывать значения . Ни один из них не преобразуется в NULL автоматически, и выполняется корректное экранирование строки.

Объединение строк - это плохая идея .

0 голосов
/ 31 января 2010

Вы можете определить myfunc следующим образом:

def myfunc(*args, **kwargs)

Где kwargs - это словарь, содержащий все именованные параметры, переданные функции.

Чтобы получить значение параметра запроса, вы должны использовать kwargs.get(name_of_parameter, 'NULL'). Чтобы построить запрос, вам нужно просто выполнить итерацию по всем элементам словаря. Однако обратите внимание, что любой параметр, переданный в качестве именованного параметра функции, попадет в запрос, если вы сделаете это таким образом.

...