Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2011 20:07:49

Borigor
От:
Зарегистрирован: 2011-03-24
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

sql_str.replace('ковычка', 'обратный слеш+ковычка+ковычка')

для записи в локальную базу MySQL использую из пакета subprocess

from subprocess import Popen, PIPE

...
sql = sql.replace('"', '\""').replace("'", "\''")
Popen("mysql test -e \"%s\"" % (sql), shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE).communicate()
SQL запрос формируется диначески, и приходят в него в том числе и ковычки, одинарные и двойные.
После долгих экспериментов получил, что запись происходит, только если осуществить преобразования наподобие указанных в сабже.
Но вот почему так, не могу понять.

г-да Гуру, объясните, пожалуйста.



Отредактировано (Март 25, 2011 10:50:55)

Офлайн

#2 Март 24, 2011 21:51:13

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sql_str.replace('ковычка', 'обратный слеш+ковычка+ковычка')

Пример неправильный. Я вижу лишь

Popen('mysql test -e “%s”' % (sql), shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE).communicate()



Офлайн

#3 Март 27, 2011 02:18:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sql_str.replace('ковычка', 'обратный слеш+ковычка+ковычка')

Popen(, stdin=PIPE, stdout=PIPE, stderr=PIPE).communicate()



Офлайн

#4 Март 27, 2011 05:08:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sql_str.replace('ковычка', 'обратный слеш+ковычка+ковычка')

Держите вдогонку: http://asvetlov.blogspot.com/2011/03/subprocess.html



Офлайн

#5 Март 27, 2011 15:48:05

Borigor
От:
Зарегистрирован: 2011-03-24
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

sql_str.replace('ковычка', 'обратный слеш+ковычка+ковычка')

Андрей Светлов
Popen(, stdin=PIPE, stdout=PIPE, stderr=PIPE).communicate()
Спасибо, Андрей, за поправку в вызове!
Но все же из чисто спортивного интереса хотелось бы знать, какое такое полезное действо (для целей исполнения SQL запроса) производят замены:
sql = sql.replace('"', '\""').replace("'", "\''")



Офлайн

#6 Март 27, 2011 16:21:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sql_str.replace('ковычка', 'обратный слеш+ковычка+ковычка')

Операционная система какая? Windows или таки Linux?



Офлайн

#7 Март 27, 2011 16:45:13

Borigor
От:
Зарегистрирован: 2011-03-24
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

sql_str.replace('ковычка', 'обратный слеш+ковычка+ковычка')

Андрей Светлов
Операционная система какая? Windows или таки Linux?
Windows



Офлайн

#8 Март 27, 2011 17:11:01

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sql_str.replace('ковычка', 'обратный слеш+ковычка+ковычка')

Тогда - просто.
Вы экранировали кавычками ваш вызов mysql. Это - прокатило.
Если желаете знать “почему” - да потому что mysql “скушал” ваш запрос - он линуксовый по природе и его правила подошли, а windows их тоже пропустил.
И тем не менее используйте список для этих целей.

Подробности найдете в list2cmdline для модуля subprocess.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version