python - форматировать многострочную строку со словарем%

У меня есть многострочная строка (большой запрос mysql), и я хочу отформатировать ее с помощью словаря (данных) следующим образом:

query = """
        INSERT LOW_PRIORITY INTO goods(id, type, volume, strength,
        country, price, description, year, image, url, class, color,
        grape, vintage, dryness, shop, added)
        VALUES (
        '%(id)s',
        '%(type)s',
        '%(volume)s',
        %(strength)d,
        '%(country)s',
        %(price)d,
        '%(description)s',
        '%(year)s',
        '%(image)s',
        '%(url)s',
        '%(class)s',
        '%(color)s',
        '%(grape)s',
        %(vintage)d,
        '%(dryness)s',
        '%(shop)s',
        '%(added)s'
        ) ON DUPLICATE KEY UPDATE
        type = '%(type)s',
        volume = '%(volume)s',
        strength = %(strength)d,
        country = '%(country)s',
        price = %(price)d,
        description = '%(description)s',
        year = '%(year)s',
        image = '%(image)s',
        url = '%(url)s',
        class = '%(class)s',
        color = '%(color)s',
        grape = '%(grape)s',
        vintage = %(vintage)d,
        dryness = '%(dryness)s',
        shop = '%(shop)s',
        added = '%(added)s""" % data

Когда я пытаюсь это сделать, я не получаю никаких ошибок, но моя строка исчезает. Есть ли способ решить эту задачу?

ОБНОВЛЕНИЕ: я обнаружил проблему. Я пытался отформатировать строку ascii со значениями unicode моего словаря. Я не видел трассировку из-за блока try/except, из которого был вызван мой метод с выполнением запроса. Мораль этой истории такова: всегда проверяйте кодировку строк в Python 2.x


person bbrodriges    schedule 10.02.2012    source источник
comment
Вы не должны делать это с помощью чистых манипуляций со строками; ваш ввод не будет правильно экранирован. MySQLdb поддерживает PEP 249, который указывает: cursor.execute(operation, parameters).   -  person beerbajay    schedule 10.02.2012
comment
Выглядит многообещающе, но я не могу найти пример с dict. Не могли бы вы указать мне на это?   -  person bbrodriges    schedule 10.02.2012
comment
Некоторые примеры, например c.execute("INSERT INTO breakfast (name, spam, eggs, sausage, price) VALUES (%s, %s, %s, %s, %s)", ["Spam and Sausage Lover's Plate", 5, 1, 8, 7.95])   -  person beerbajay    schedule 10.02.2012
comment
В этом примере вы передаете список кортежей, пока у меня есть словарь.   -  person bbrodriges    schedule 10.02.2012
comment
Вот почему это комментарий, а не ответ. Если вы используете свой текущий метод, ваши данные не будут должным образом экранированы.   -  person beerbajay    schedule 10.02.2012
comment
В настоящее время предпочтительнее использовать метод .format().   -  person 2rs2ts    schedule 31.01.2014


Ответы (2)


Я подозреваю, что в вашем диктофоне данных отсутствует какой-то ключ.

Например:

In [1]: "%(xx)s" % dict()
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/<redacted>/<ipython-input-1-475612d1eaa2> in <module>()
----> 1 "%(xx)s" % dict()

KeyError: 'xx'
person Dima Tisnek    schedule 10.02.2012

Что вы имеете ввиду под "исчезает"? Если вы выдаете print query, что возвращается? Похоже, вы пропустили одну кавычку в последней строке: не должно ли это быть added = '%(added)s'""" % data

person parvus    schedule 10.02.2012
comment
Спасибо за пропущенную цитату. Под исчезновением я подразумеваю, что если я удалю% данных и вызову запрос на печать, он будет успешно напечатан, но запрос% данных вообще не печатается - person bbrodriges; 10.02.2012