【问题标题】:Sqlite insert not working with pythonSqlite插入不适用于python
【发布时间】:2013-07-31 17:09:30
【问题描述】:

我在 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));

【问题讨论】:

  • 您在通话中遇到了哪些错误?另外,您的 tblExtensionHistory 表的完整架构是什么?
  • 执行插入后,您必须致电db.commit()
  • @JoranBeasley:如果他从INSERT 收到错误,COMMIT 将无济于事。
  • 你的正确阅读理解对我来说失败了......我没有看到他有错误
  • 你还没有给我们足够的信息。向我们展示实际代码、您传递的实际值以及实际的数据库架构。在不知道您传入的类型或数据库期望的类型的情况下,我们无法帮助您调试类型错误。

标签: python insert sqlite many-to-many foreign-key-relationship


【解决方案1】:

没有完整的细节很难确定,但我想我可以猜到问题所在。

如果您使用不带列名的 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,或其他数据库的类似文档。

【讨论】:

  • 是的,我认为你的权利...insert into TABLE (col_name1,col_name2) VALUES (?,?) 可能会解决它
  • 我也试过了,它不工作一直说参数0可能不支持类型@abarnert
  • @NottyShinchan:正如 Humdinger 已经解释的那样,您必须向我们提供您运行的实际代码、运行它的架构以及您遇到的确切错误,而不是对您尝试的内容的模糊解释以及对错误的松散解释。
  • @NottyShinchan:不。创建一个足以证明问题的SSCCE,然后在此处发布。
  • 感谢@abarnert sqlite.Row 解决了这个问题。它现在就像一个魅力。 :)
猜你喜欢
  • 2014-04-24
  • 2013-10-20
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多