проблема изменения строки с использованием python и sqlite3

В строке моей базы данных есть строка "a'GG'g-CH2OHCH2CH2OH;v=0;". Эта строка включает знаки ". Я хочу изменить символ " на символ '. но я получаю это сообщение об ошибке: OperationalError: рядом с "GG": синтаксическая ошибка. Мой запрос таков:

query_string = "UPDATE " + NameOfPartFuncTable + " SET " + ColumnNameForNamePartFunc + " = " + "\'a\'GG\'g-CH2OHCH2CH2OH;v=0;\'"  + " WHERE (" + ColumnNameForNamePartFunc + " = " + "\"a\'GG\'g-CH2OHCH2CH2OH;v=0;\"" + " )"

Я думаю, что эта проблема связана с проблемой escape-символа. Как я могу решить эту проблему?


person yasminpoyraz    schedule 24.05.2020    source источник


Ответы (2)


В документации по синтаксису SQLite строковые литералы следует заключать в одинарные кавычки. Если вы хотите включить в строку одинарную кавычку, это делается путем ввода двух последовательных одинарных кавычек.

Таким образом, оператор SQL, который вы хотите выполнить, будет таким:

UPDATE tablename SET columnname = '''a''GG''g-CH2OHCH2CH2OH;v=0;''' WHERE columnname = '"a''GG''g-CH2OHCH2CH2OH;v=0;"'

Тогда у вас возникает вопрос, как построить эту строку в python. В python при заключении строкового литерала в одинарные кавычки нет необходимости экранировать двойные кавычки внутри этой строки, а также при заключении в двойные кавычки. О различных типах строковых литералов и о том, как работает экранирование в python, см. здесь.

Исходя из этого, это один из способов сделать это (при условии, что вы используете python 3.5 или новее)

old_str = "\"a'GG'g-CH2OHCH2CH2OH;v=0;\"".replace("'", "''")
new_str = "'a'GG'g-CH2OHCH2CH2OH;v=0;'".replace("'", "''")
query_string = "UPDATE {tbl} SET {col} = '{new_str}' WHERE ( {col} = '{old_str}' )".format(
    tbl = NameOfPartFuncTable,
    col = ColumnNameForNamePartFunc,
    old_str = old_str,
    new_str = new_str
)
person faidros    schedule 24.05.2020
comment
Спасибо, но я не могу. Когда я запускаю этот запрос, в основном query_string = SELECT ( + ColumnNameForNamePartFunc +) FROM + NameOfPartFuncTable, и когда я печатаю 778. строку, я получаю такой результат: (a'GG'g-CH2OHCH2CH2OH;v=0;,), я хочу только замените двойные кавычки одинарными. - person yasminpoyraz; 25.05.2020

Вы не правильно фиксируете кавычки в тексте.

Например, предложение WHERE становится таким:

WHERE (column= "a\'GG\'g-CH2OHCH2CH2OH;v=0;")

Внешние кавычки необходимы для всех текстовых значений, если вы создаете строку запроса, подобную этой, но они не являются кавычками внутри самого значения.

Вам лучше использовать функцию REPLACE, если все, что вы хотите сделать, это заменить " с ', и вы можете сделать это в параметризованном запросе следующим образом:

c = conn.cursor()
c.execute("UPDATE table SET column = replace( column, ?, ? ) WHERE column = ?;", ('"', "'", '''"a'GG'g-CH2OHCH2CH2OH;v=0;"'''))
c.commit()

где table и column — имена вашей таблицы и столбца соответственно. Обратите внимание на тройные кавычки вокруг значения. Параметризованный запрос безопаснее использовать, чем форматированные строки, поскольку они защищают от Атаки с внедрением SQL.

person jignatius    schedule 24.05.2020
comment
Спасибо за ваш ответ, но я не понимаю смысла? - person yasminpoyraz; 25.05.2020
comment
@yasminpoyraz ? является заполнителем. Он заменяется фактическими значениями, которые вы указываете во второй части execute. Преимуществом является лучшая защита от атак SQL-инъекций и автоматическое преобразование типов. Это рекомендуемая практика. Надеюсь, мой ответ помог вам? - person jignatius; 25.05.2020
comment
Когда я запускаю следующий запрос = SELECT ( + ColumnNameForNamePartFunc + ) FROM + NameOfPartFuncTable cursor.execute(query) row = cursor.fetchall() print(row[5] = , row[5]) row[5] = (a'GG 'g-CH2OHCH2CH2OH;v=0;,) Раньше я думал, что этот столбец должен быть строкой, но когда я запускаю этот запрос = SELECT typeof ( + ColumnNameForNamePartFunc + ) FROM + NameOfPartFuncTable, я получил «текстовый» ответ. Мне очень жаль, потому что я новичок в sqlite и python. И, к сожалению, я не могу изменить в этом тексте знаки двойной квоты на одинарную. Может ли эта станция что-то изменить в этом запросе? - person yasminpoyraz; 28.05.2020
comment
@yasminpoyraz Столбец имеет текстовый/строковый тип. cursor.fetchall() возвращает список кортежей. Обновление результатов не приведет к обновлению значения в базе данных. Для этого вам нужно будет сделать запрос на обновление. Основная проблема, с которой вы столкнулись, заключается в том, как сформировать допустимую строку Python. Вы можете сделать это с помощью тройных внешних кавычек или экранирования с помощью \: '''"a'GG'g-CH2OHCH2CH2OH;v=0;"''' или "\"a'GG'g-CH2OHCH2CH2OH;v=0;\"". Затем передайте это в параметризованный запрос, как я сказал в своем ответе. - person jignatius; 28.05.2020