Sqlite插入不适用于python

Sqlite插入不适用于python,python,insert,sqlite,many-to-many,foreign-key-relationship,Python,Insert,Sqlite,Many To Many,Foreign Key Relationship,我正在Python2.7上使用sqlite3,我面临着一个多对多关系的问题。我有一个表,从中提取它的主键,如下所示 current.execute("SELECT ExtensionID FROM tblExtensionLookup where ExtensionName = ?",[ext]) current.execute("INSERT INTO tblExtensionHistory VALUES(?,?)",[Hid,Eid]) 然后我从另一个表中获取另一个主键 current.

我正在Python2.7上使用sqlite3,我面临着一个多对多关系的问题。我有一个表,从中提取它的主键,如下所示

current.execute("SELECT ExtensionID FROM tblExtensionLookup where ExtensionName = ?",[ext])
current.execute("INSERT INTO tblExtensionHistory VALUES(?,?)",[Hid,Eid])
然后我从另一个表中获取另一个主键

current.execute("SELECT HostID FROM tblHostLookup where HostName = ?",[host])
现在我要做的是,我有第三个表,这两个键作为外键,我像这样插入它们

current.execute("SELECT ExtensionID FROM tblExtensionLookup where ExtensionName = ?",[ext])
current.execute("INSERT INTO tblExtensionHistory VALUES(?,?)",[Hid,Eid])
问题是我不知道为什么,但最后一次插入不起作用,它不断地给出错误。现在我尝试的是:

首先我想是因为我有一个自动增量主ID,用于最后一个映射表,我没有提供它,但是它不应该认为它本身是自动递增的吗?然而,我继续尝试添加Null、None、0,但没有任何效果

第二,我想可能是因为我没有从上面的表格中得到值,所以我试着把它打印出来,然后显示出来,这样它就可以工作了

有什么建议我做错了什么吗

编辑: 当我不提供主键时,我得到的错误是

The table has three columns but you provided only two values
当我将它们设置为None、Null或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));

没有完整的细节很难确定,但我想我能猜出问题所在

如果使用不带列名的
INSERT
语句,则值必须与架构中给定的列完全匹配。你不能跳过任何一个*

解决这个问题的正确方法是只使用
INSERT
语句中的列名。比如:

current.execute("INSERT INTO tblExtensionHistory (HostID, ExtensionID) VALUES (?,?)",
                [Hid, Eid])
[3]
现在,您可以跳过所需的任何列(当然,只要它们是自动递增、可为null或可跳过的),或者按照您想要的顺序提供它们


对于第二个问题,您试图将行作为单个值进行传递。你不能那样做。从您的代码:

Eid = current.fetchone()
这将返回如下结果:

current.execute("INSERT INTO tblExtensionHistory (HostID, ExtensionID) VALUES (?,?)",
                [Hid, Eid])
[3]
然后尝试将其绑定到
ExtensionID
列,这会给您一个错误


将来,您可能希望尝试在
sqlite3
命令行工具和/或您最喜欢的GUI数据库管理器中编写和调试SQL语句(如果您不需要任何花哨的东西,可以在Firefox中运行一个简单的扩展),并在尝试正确使用Python之前,将其正确使用



*并非所有数据库都是如此。例如,在MSJET/Access中,必须跳过自动增量列。有关SQLite如何在没有列名的情况下解释
INSERT
,或其他数据库的类似文档,请参阅。

您在通话中遇到了哪些错误?另外,tblExtensionHistory表的完整模式是什么?在执行insert后,必须调用
db.commit()
@JoranBeasley:如果他在
insert
中出错,那么
commit
不会有任何帮助。你正确的阅读理解对我来说是失败的。。。我看不出他有什么差错。你还没有给我们提供足够的信息。向我们展示实际的代码、传递的实际值以及实际的数据库模式。如果不知道要传递的类型或数据库需要的类型,我们无法帮助您调试类型错误<代码>插入到表中(col_name1,col_name2)值(?,)可能会修复itI我也尝试过,它不起作用一直说参数0可能是不支持的类型@abarnert@NottyShinchan:正如Humdinger已经解释过的,您必须向我们提供您运行的实际代码、运行它所依据的模式以及您得到的确切错误,不是对您尝试的内容的模糊解释,也不是对错误的松散解释。@NottyShinchan:不。创建一个足够大的文件来演示问题,并将其发布在这里。谢谢@abarnert sqlite。Row解决了问题。现在它就像一个符咒