1

我在 python 2.7 上使用 sqlite3,我遇到了多对多关系的问题。我有一个表,我正在从中获取它的主键,如下所示

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

当我将它们提供为 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));
4

1 回答 1

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 文档以了解 SQLite 如何INSERT在没有列名的情况下进行解释,或其他数据库的类似文档。

于 2013-07-31T17:14:20.300 回答