1

我正在python 2.7上使用sqlite3,我面臨着多對多關係的問題。我從我取的主鍵,這樣Sqlite插入不能用python

current.execute("SELECT ExtensionID FROM tblExtensionLookup where ExtensionName = ?",[ext]) 

,然後我從另一個表

current.execute("SELECT HostID FROM tblHostLookup where HostName = ?",[host]) 

現在我在做什麼讀取另一個主鍵的表是我的第三個表這兩個鍵的外鍵和我插入他們喜歡這個

current.execute("INSERT INTO tblExtensionHistory VALUES(?,?)",[Hid,Eid]) 

的問題是我不知道爲什麼,但最後的插入不工作就一直給錯誤。現在我所嘗試的是:

首先,我認爲這是因爲我有一個自動增量的主要ID爲最後一個映射表,我沒有提供,但不是它應該考慮自己,因爲它是自動遞增?但是,我繼續嘗試添加Null,None,0,但沒有任何效果。

其次,我想也許是因爲我沒有從上面的表中獲取值,所以我試圖打印出來,它顯示它的工作原理。

任何建議我在做什麼錯在這裏?

編輯: 當我不提供主鍵,我得到錯誤的

The table has three columns but you provided only two values 

,當我做他們提供如無,空或0它說

Parameter 0 is not supported probably because of unsupported type 

我嘗試執行@abarnet的方式,但仍然一直說參數0不支持

connection = sqlite3.connect('WebInfrastructureScan.db') 
    with connection: 
     current = connection.cursor() 
     current.execute("SELECT ExtensionID FROM tblExtensionLookup where ExtensionName = ?",[ext]) 
     Eid = current.fetchone() 
     print Eid 
     current.execute("SELECT HostID FROM tblHostLookup where HostName = ?",[host]) 
     Hid = current.fetchone() 
     print Hid 

     current.execute("INSERT INTO tblExtensionHistory(HostID,ExtensionID) VALUES(?,?)",[Hid,Eid]) 

編輯2:

數據庫模式是:

表1:

CREATE TABLE tblHostLookup ( 
HostID INTEGER PRIMARY KEY AUTOINCREMENT, 
HostName TEXT); 

表2:

CREATE TABLE tblExtensionLookup ( 
ExtensionID INTEGER PRIMARY KEY AUTOINCREMENT, 
ExtensionName TEXT); 

表3:

CREATE TABLE tblExtensionHistory (
ExtensionHistoryID INTEGER PRIMARY KEY AUTOINCREMENT, 
HostID INTEGER, 
FOREIGN KEY(HostID) REFERENCES tblHostLookup(HostID), 
ExtensionID INTEGER, 
FOREIGN KEY(ExtensionID) REFERENCES tblExtensionLookup(ExtensionID)); 
+1

您在通話中遇到的錯誤是什麼?另外,你對tblExtensionHistory表的完整模式是什麼? –

+0

執行完你的插入之後__必須調用'db.commit()' –

+0

@JoranBeasley:如果他從INSERT中得到錯誤,那麼COMMIT不會對任何事情有所幫助。 – abarnert

回答

3

沒有完整的細節很難確定,但我想我可以猜到這個問題。

如果使用不帶列名的INSERT語句,則這些值必須與架構中給出的列完全匹配。您不能跳過其中任何一個。*

解決此問題的正確方法是僅使用INSERT語句中的列名稱。喜歡的東西:

current.execute("INSERT INTO tblExtensionHistory (HostID, ExtensionID) VALUES (?,?)", 
       [Hid, Eid]) 

現在,您可以跳過任何你想要的列(只要它們是自動增量,可爲空,否則可跳過,當然),或任何你想要的順序提供給他們。


關於第二個問題,你想在行通過,就好像它們是單值。你不能那樣做。從你的代碼:

Eid = current.fetchone() 

這將返回類似:

[3] 

然後嘗試綁定是到ExtensionID列,它給你一個錯誤。


在未來,你可能會想嘗試編寫和調試在sqlite3命令行工具和/或你最喜歡的GUI數據庫管理器的SQL語句(有運行在Firefox中,如果您的簡單擴展不要任何奇怪的東西),並讓它們正確,然後再嘗試讓Python正確。


*這不適用於所有數據庫。例如,在MSJET/Access中,您必須跳過自動增量列。請參閱SQLite documentation瞭解SQLite如何解釋INSERT沒有列名或其他數據庫的類似文檔。

+0

是啊我想你的權利......'插入到表(col_name1,col_name2)VALUES(?,?)'可能會修復它 –

+0

我也試過,它不工作繼續說參數0可能不支持類型@abarnert – user9517536248

+0

@NottyShinchan :Humdinger已經解釋過,你必須給我們你運行的實際代碼,以及你運行它的模式,以及你得到的確切錯誤,而不是模糊地解釋你所嘗試的內容以及錯誤的錯誤解釋。 – abarnert