На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: RaD
  
    > Как передать процент (%) в SQL запросе
      Здравствуйте.
      Спрашиваю у многих - никто не может ничего сказать. А проблема вот в чем. Пишу SQL запрос, в котором используется подставнока с %, но эту подстановку надо передать в MySQL. Но в этом же запросе есть подстановка для метода execute:
      ExpandedWrap disabled
        sql = "SELECT disp.status.NAME, FROM_UNIXTIME(disp.data.DATE,'%d.%m.%Y') AS DATE,disp.data.DO_PERCENT, disp.data.INFO FROM disp.data INNER JOIN disp.status ON disp.status.ID=disp.data.STATUS_ID ORDER BY disp.data.DATE DESC WHERE disp.NAME LIKE %s"
        #Далее прикладываю запрос пользователя и выполняю весь SQL:
        cursor.execute(sql, ("%" + like_query + "%",))


      Как заэкранировать проценты в FROM_UNIXTIME и оставить %s? Пробовал удваивать - %%, но в FROM_UNIXTIME они проходят вместе в MySQL и возникает ошибка.
      Понятно, что можно совмещать строки не в cursor.execute(), а в обычной строке - но хотелось бы правильно писать, да и от встраивания кода тоже защита не помешала бы...
      Если отладка - устранение ошибок, то программирование - их создание.
        А как ты из Питона доступ к MySQL получаешь? Штатная библиотека обеспечивает только работу с базами sqlite.

        И в штатной библиотеке для передачи параметров в sql-запрос используется не %s, а знак вопроса.
        Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
          Я использую pymysql:
          ExpandedWrap disabled
            import pymysql
            # ...
            def initDb(host_addr, uname, psw, dbase):
                connection = pymysql.connect(host_addr, uname, psw,
                             dbase, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor, autocommit=True)
                return connection
             
            # ...
            # как пример
            def isAdmin(connection, tel_uid):
                sql = "SELECT `user_admingroup` FROM `tb_users` WHERE `tb_user_id`=%s"
                cursor = connection.cursor()
                try:
                    cursor.execute(sql, (tel_uid))
                    row = cursor.fetchone()
                    if row:
                       return row["user_admingroup"]
                    else: return False                  
                except pymysql.DatabaseError as e:
                       logger.error("Database error: ", e)
          Если отладка - устранение ошибок, то программирование - их создание.
            А pymysql что, знак вопроса для обозначения места вставки параметра не понимает? Это же вроде стандартный способ в SQL-запросах.
            Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script Execution time: 0,0754 ]   [ 14 queries used ]   [ Generated: 16.06.19, 23:34 GMT ]