Новичок Python вопрос о строках с параметрами: "%% s"? - PullRequest
5 голосов
/ 25 ноября 2008

Я пытаюсь выяснить, что именно делает следующая строка, особенно часть %% s?

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (%%s, %%s)'%sourcedest, (self.tkt.id, n))

Какой-нибудь хороший мини-учебник по форматированию строк и вставке переменных в строки с помощью Python?

Ответы [ 5 ]

6 голосов
/ 25 ноября 2008

%% становится одним %. Этот код по существу выполняет два уровня форматирования строки. Сначала выполняется %sourcedest, чтобы превратить ваш код по существу в:

cursor.execute('INSERT INTO mastertickets (BLAH, FOO) VALUES (%s, %s)', (self.tkt.id, n))

затем слой db применяет параметры к оставшимся слотам.

Двойной% необходим для безопасного прохождения слотов БД через первую операцию форматирования строки.

4 голосов
/ 25 ноября 2008

«а как вместо этого сделать?»

Жесткий вызов. Проблема в том, что они вставляют метаданные (в частности, имена столбцов) на лету в оператор SQL. Я не большой поклонник такого рода вещей. Переменная sourcedest имеет два имени столбца, которые будут обновлены.

Скорее всего, есть только одна (или несколько) пар имен столбцов, которые фактически используются. Я предпочитаю делать это.

if situation1:
    stmt= "INSERT INTO mastertickets (this, that) VALUES (?, ?)"
elif situation2:
    stmt= "INSERT INTO mastertickets (foo, bar) VALUES (?, ?)"
else:
    raise Exception( "Bad configuration -- with some explanation" )
cursor.execute( stmt, (self.tkt.id, n) )

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

3 голосов
/ 25 ноября 2008

Вставить имена столбцов с использованием форматирования строк не так уж и плохо, если они не предоставлены пользователем. Значения должны быть параметрами запроса:

stmt = "INSERT INTO mastertickets (%s, %s) VALUES (?, ?)" % srcdest
...
cursor.execute( stmt, (self.tkt.id, n) )
1 голос
/ 25 ноября 2008

%% превращается в один%

0 голосов
/ 25 ноября 2008

То же самое:

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (:%s, :%s)' % \
    tuple(sourcedest + sourcedest), dict(zip(sourcedest, (self.tkt.id, n))))

Никогда не делай этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...