2011-05-01 2 views
0

나는 python 스크립트로 print 문을 가지고 있습니다.인쇄 된 문장 실행

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\')"') 

어떻게 위의 문에서 변수 값을 대체 할 수 있습니까?

답변

3
import subprocess 
p = subprocess.Popen("mysql -e\"insert into test.syllabalize values (",text_index, ",", index, ",", "'",syllable,"')\"",shell=True) 
p.wait() 

하지만이 작업을 수행하는 대신 파이썬 모듈 중 하나를 사용하여 mysql 데이터베이스 액세스를 사용해야합니다. 사람들은 당신이 사용할 수 있도록 :

db.execute("insert into test.syllabalize values (?,?,?)", (text_index, index, syllable)) 

매개 변수화 된 쿼리가 subprocess.Popen 그들을 제공 사실

너무

p = subprocess.Popen(["mysql", "-e", "\"insert into test.syllabalize values (",text_index, ",", index, ",", "'",syllable,"')\""]) 

더 쉘 주입이 양식하지만 SQL에서 가능하지 SQL 인젝션으로부터 완벽한 보호를 제공 쿼리는 여전히 취약합니다.

0

가장 간단한 방법은 system 내장 기능을 사용하는 것입니다. 훨씬 더 고급 제어의 경우 표준 라이브러리의 subprocess 모듈을 사용하십시오.

P. 보안 문제를 피하려면 SQL 쿼리를 삭제하고 사용자로부터받은 입력을주의하십시오.

+1

os.system을 사용하여야한다, 모든 명령은 –

+0

os.system을 내가 찾고 있었던 것입니다 서브 프로세스 모듈을 통해 수행해야합니다. 그러나 변수 값 대신 변수 이름을 DB에 삽입합니다. 나는 내 질문을 업데이트했다. – shantanuo

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")) 
0

내가 원하는지 확실하지 않습니다. 그러나 여기 시도가있다.

test_index = 3 
index = 5 
syllable = 'abc' 

os.system('mysql -e"insert into test.syllabalize values ({0}, {1}, {2})"' % (test_index, index, syllable)) 
+0

# Python 2.4.3 # AttributeError : 'str'객체에 'format'속성이 없습니다. – shantanuo

+0

예, Python 2.4.3에는 형식이 포함되어 있지 않습니다. 그것은 2.6에 추가되었습니다. 2.4.3에서는 다음을 원합니다 : os.system ('mysql -e "는 test.syllabalize 값 (% s, % s, % s)에 삽입하십시오)' '% (test_index, index, syllable) –