Выполнение печатной инструкции

#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, индекс, слог))