2012-05-08 44 views
0

我是一名Python初學者。我正在訪問數據庫上進行查詢。我想將一個字符串變量傳遞給sql語句,但無法解決它的雙。如何在python中傳遞sql語句的變量?

這裏是我的代碼:

qllname = 29221.0 

llname = "01-01-05-W2" 

sqlstatement = recordset.Open("SELECT * FROM LLD WHERE LLD = '%s'" % (llname),connection,1,3) 

for x in range(recordset.Fields.Count): 

    fields_dict[x] = recordset.Fields.Item(x).Name 

    print fields_dict[x], recordset.Fields.Item(x).Value, x 


sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3) 

for x2 in range(recordset2.Fields.Count): 

    print recordset2.Fields.Item(x2).Value, type(recordset2.Fields.Item(x2).Value) 

結果:

LLD 01-01-05-W2 0 
X 678817.81875 1 
Y 5431052.45982 2 
Traceback (most recent call last): 
    File "L:/temporary/start of test/accessnew--.py", line 25, in <module> 
    sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3) 
    File "<COMObject ADODB.Recordset>", line 4, in Open 
com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft JET Database Engine', u'Data type mismatch in criteria expression.', None, 5003071, -2147217913), None) 
>>> 
+1

您應該嘗試使用實際與Python的DBAPI規範兼容的數據庫api。 – ThiefMaster

回答

3

嘗試:

sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3) 

您使用的是%d字符串插值運算符,它告訴我,你是將一個數字傳遞給SQL語句。然而,當我認爲你需要一個整數時,你使用了一個SQL字符串。我想你想看起來像一個SQL語句 -

SELECT * FROM SWAWELLS WHERE WWDR_NO = 29221 

不過,您所提供的代碼會產生這樣的說法:

SELECT * FROM SWAWELLS WHERE WWDR_NO = '29221' 

如果WWDR_NO是一個整數,比你會得到「數據在標準表達式中輸入不匹配「您在上面收到。

試試這個:

# Notice there is no ' around %d 
sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS " 
           "WHERE WWDR_NO = %d" % 
           (qllname),connection2,1,3) 

而且,正如其他人所說,你應該使用DBAPI包裝。那是什麼? DB-API是訪問數據庫的python「標準」。有一種可用於ACCESS的稱爲adodbapi。我不知道這個圖書館的狀態。人們說遠離上述插值的原因是因爲它可能會構建無效的SQL,並且如果您從不可信來源獲取數據,則存在安全風險。

其他BIG使用dbapi的好處是它是一個標準。如果你給它一個按鈕,你的代碼將合理地移植到其他數據庫中。

想要立即查看DBAPI而無需下載庫嗎?如果您使用py2.5或更高版本,您可以使用sqlite構建它。檢查sqlite3模塊here

2

您不應該使用%格式化運算符。這是不安全的。

這裏是Python數據庫API規範v2.0 http://www.python.org/dev/peps/pep-0249/

大多數蟒DB包裝的支持它。

+0

這是正確的,你通常不應該這樣做。但如果你看@代碼,它看起來很像微軟ADO的東西。我可能是錯的,我很久沒有這樣做過。對於這種情況,我認爲API提供了一種準備SQL語句的方法。 – jaime