2011-05-01 178 views
0

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

如何用上述語句中的變量替換值?

回答

3
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注入完整的保護

其實subprocess.Popen提供了他們太多

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

無殼注入可能以這種形式,但SQL查詢仍然很脆弱。

0

最簡單的方法是使用system內置函數。要進行更高級的控制,請使用標準庫的subprocess模塊。

P.S.爲了避免安全問題,請確保清理SQL查詢並防止從用戶那裏收到輸入。

+1

,所有命令都應該通過子模塊來完成 – 2011-05-01 13:56:48

+0

使用os.system就是我一直在尋找。但它將在數據庫中插入變量名稱而不是變量值。我更新了我的問題。 – shantanuo 2011-05-01 14:54:03

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

我不知道這是否是你想要的。但這是一個嘗試。使用os.system不使用

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'對象沒有屬性'格式' – shantanuo 2011-05-02 03:06:55

+0

是的,Python 2.4.3不包含格式。它是在2.6中添加的。對於2.4.3,您需要: os.system('mysql -e「insert into test.syllabalize values(%s,%s,%s)''%(test_index,index,syllable)) – 2011-05-03 23:24:04