PyMysql с использованием REGEXP_REPLACE со строковыми параметрами (запрос на обновление для mariaDB)

Поэтому я хотел обновить таблицу, в которой мне нужно изменить содержимое определенного столбца. Для обновленного значения мне нужно использовать RegEx. К счастью, моя БД — MariaDB, поэтому она поддерживает REGEXP_REPLACE.

Теперь я написал скрипт Python, который должен делать следующее: взять список строк (скажем, слов) и, если значение столбца начинается с одной из этих строк, удалить его. SQL-запрос должен быть в основном таким:

REGEXP_REPLACE(column, '(?i)^(%s\\s+)', '');

т. е. я делаю совпадение без учета регистра, когда в начале значения столбца появляется определенная строка (указанная %s), за которой следует любое количество пробелов.

Теперь, когда я пытаюсь поместить это в сценарий, я сталкиваюсь с несколькими проблемами, в зависимости от того, как я ввожу параметр в запрос.

  1. Использование интерполяции строк Я знаю, что это не лучший способ сделать это, но вот как это выглядит:

    sql = "UPDATE `table` SET `column` = REGEXP_REPLACE(`column`, '(?i)^(%s\\\\s+)', '');" % (term)
    cursor.execute(sql)
    

    Когда я использую это, term вставляется правильно (я проверяю print(cursor.mogrify(sql, (term,)))), но у меня возникают проблемы, если term содержит какие-либо символы, которые должны быть экранированы в регулярном выражении, например. -.

  2. Использование выполнения с параметрами Это более чистый вариант, но здесь возникает другая проблема — строка вставляется вместе с кавычками. Что нарушает все утверждение, потому что в нем также есть кавычки. Итак, вот код:

    sql = "UPDATE `table` SET `column` = REGEXP_REPLACE(`column`, '(?i)^(%s\\\\s+)', '');"
    cursor.execute(sql, (term,))
    

    Но это приводит к таким утверждениям:

    UPDATE `table` SET `column` = REGEXP_REPLACE(`column`, '(?i)^('example'\\s+)', '');
    

    со строкой в ​​кавычках внутри регулярного выражения, которое также находится в кавычках.

Любые предложения, как я могу решить эту проблему? Мне нужно иметь замещающие термины внутри регулярного выражения без кавычек, но также, если внутри заменяющих терминов есть какие-либо специальные символы, их нужно экранировать. Возможно, мне нужно написать для этого отдельную функцию, но я не уверен. Я не очень хорошо разбираюсь в Python и в SQL.

Заранее спасибо за любые подсказки.


person codebat    schedule 06.04.2017    source источник
comment
Попробуйте % (re.escape(term)) первым методом.   -  person Wiktor Stribiżew    schedule 06.04.2017
comment
Кажется, работает! Спасибо. Иногда это мелочи....   -  person codebat    schedule 06.04.2017