Я пытаюсь понять, что именно делает следующая строка - в частности, часть %% s?
cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (%%s, %%s)'%sourcedest, (self.tkt.id, n))
Есть ли хороший мини-учебник по форматированию строк и вставке переменных в строки с помощью Python?
плагин mastertickets для trac
ох, и из любопытства ... я согласен, что это не очень читабельно (отсюда вопрос;), но как это сделать вместо этого?






%% превращается в единичный%
%% становится одним %. Этот код, по сути, выполняет два уровня форматирования строк. Сначала выполняется %sourcedest, чтобы по существу превратить ваш код в:
cursor.execute('INSERT INTO mastertickets (BLAH, FOO) VALUES (%s, %s)', (self.tkt.id, n))
затем слой db применяет параметры к оставшимся слотам.
Двойной% необходим для безопасного прохождения слотов БД через первую операцию форматирования строки.
"но как это сделать вместо этого?"
Жесткий призыв. Проблема в том, что они на лету вставляют метаданные (в частности, имена столбцов) в оператор 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) )
Когда существует более одной допустимой комбинации столбцов для такого рода вещей, это означает, что модель данных объединила две сущности в одну таблицу, что является общей проблемой проектирования базы данных. Поскольку вы работаете с продуктом и надстройкой, вы мало что можете сделать с проблемами модели данных.
Вставка имен столбцов с использованием строкового форматирования не так уж и плоха, если они не предоставлены пользователем. Однако значения должны быть параметрами запроса:
stmt = "INSERT INTO mastertickets (%s, %s) VALUES (?, ?)" % srcdest
...
cursor.execute( stmt, (self.tkt.id, n) )
Он делает то же самое:
cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (:%s, :%s)' % \
tuple(sourcedest + sourcedest), dict(zip(sourcedest, (self.tkt.id, n))))
Никогда не делай этого.
о, не волнуйся. я не буду. о_О
Вонючий фрагмент кода. Где вы это нашли? Этого я бы хотел избежать.