Задать вопрос
@OrangeXD

Как решить проблему с кодировкой при запросе в базу данных модулем pymysql?

Пишу бота Telegram на python3 и с использованием библиотекам python-telegram-bot и pymysql.
Возникла необходимость извлекать строки из базы данных по определенному значению.
Кодировка базы данных MySQL - utf8.
Кодировка в модуле при подключении к базе - utf8mb4 (Как я понял, utf-8 и utf8mb4 - это одно и то же).
Значение для выборки - строка из ответа пользователя, которая задана на кнопке заранее. Судя по документации Telegram API - передается также в кодировке utf-8. (Например: Москва)

Но не работает вторая функция:

def city_choice(bot, update, user_data):
    user = update.message.from_user
    with connection.cursor() as cursor:
        sql = "SELECT `id`, `name` FROM `cities`"
        cursor.execute(sql)
        result = cursor.fetchall()
    reply_keyboard = [[name['name']] for name in result]
    markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    update.message.reply_text(
        "Выберите город: ",
        reply_markup=markup)

    return DISTRICT

def district_choice(bot, update, user_data):
    text = update.message.text
    with connection.cursor() as cursor:
        sql = "SELECT `id` FROM `cities` WHERE `name`=`Москва`"
        cursor.execute(sql)
        result = cursor.fetchone()
    user_data['Город'] = text
    reply_keyboard = [[name['name']] for name in result]
    markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
    update.message.reply_text('Выбран город "%s", теперь выберите район: ' % text,
                              reply_markup=markup)

    return PRODUCT


Выдает вот такую ошибку:
pymysql.err.InternalError: (1054, "Unknown column '\u041c\u043e\u0441\u043a\u0432\u0430' in 'where clause'")


Пробовал .encode("utf-8"), .encode("utf8"), u" - не помогло.
Вывод кириллических значений работает правильно. Куда копать, чтобы заставить работать?
  • Вопрос задан
  • 638 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
roswell
@roswell
и швец, и жнец, и на дуде игрец
А для чего слово Москва взято не в одинарные, а в обратные кавычки? Естественно, что MySQL это дело начинает воспринимать не как текст, а как имя столбца.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
utf8 , без черточки
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы