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