#python
#python
Вопрос:
У меня есть инструкция print в скрипте Python.
print "mysql -e"insert into test.syllabalize values (",text_index, ",", index, ",", "'",syllable,"')""
Это выводит правильную инструкцию mysql…
mysql -e"insert into test.syllabalize values ( 3 , 5 , 'abc')"
Как мне выполнить эту инструкцию?
Он выводит его только в стандартном виде.
Обновить:
В следующем будет предпринята попытка вставить текст вместо значений переменных.
os.system('mysql -e"insert into test.syllabalize values ('text_index', 'index', 'syllable')"')
Как мне заменить значения переменными в приведенной выше инструкции?
Ответ №1:
import subprocess
p = subprocess.Popen("mysql -e"insert into test.syllabalize values (",text_index, ",", index, ",", "'",syllable,"')"",shell=True)
p.wait()
но вам следует рассмотреть возможность использования одного из модулей python для доступа к базе данных mysql, а не делать этого. они позволяют использовать:
db.execute("insert into test.syllabalize values (?,?,?)", (text_index, index, syllable))
параметризованные запросы обеспечивают полную защиту от внедрения sql
фактически подпроцесс.Popen также предоставляет их
p = subprocess.Popen(["mysql", "-e", ""insert into test.syllabalize values (",text_index, ",", index, ",", "'",syllable,"')""])
в этой форме внедрение оболочки невозможно, но sql-запрос по-прежнему уязвим.
Ответ №2:
Поскольку вы используете MySQL, почему бы не использовать MySQLdb, это намного безопаснее и проще.
import MySQLdb
db = MySQLdb.connect("host", "user", "pass", "db")
c = db.cursor()
c.execute("insert into test.syllabalize values ( %s , %s , %s)", (3,5,"abc"))
Ответ №3:
Самый простой способ — использовать system
встроенную функцию. Для гораздо более продвинутого управления используйте subprocess
модуль стандартной библиотеки.
P.S. Чтобы избежать проблем с безопасностью, убедитесь, что вы очищаете SQL-запросы и остерегаетесь ввода, полученного от пользователя.
Комментарии:
1. os.system не должна использоваться, все команды должны выполняться через модуль подпроцесса
2. os.system — это то, что я искал. Но это вставка имени переменной вместо значений переменных в БД. Я обновил свой вопрос.
Ответ №4:
Я не уверен, что это то, чего вы хотите. Но вот попытка.
test_index = 3
index = 5
syllable = 'abc'
os.system('mysql -e"insert into test.syllabalize values ({0}, {1}, {2})"' % (test_index, index, syllable))
Комментарии:
1. # Python 2.4.3 # Ошибка атрибута: объект ‘str’ не имеет атрибута ‘format’
2. Да, Python 2.4.3 не включает формат. Это было добавлено в 2.6. Для 2.4.3 вы хотите: os.system(‘mysql -e»вставить в test.syllabalize значения (%s, %s, %s)»‘ % (test_index, индекс, слог))