【问题标题】:creating blank field and receving the INTEGER PRIMARY KEY with sqlite, python创建空白字段并使用 sqlite、python 接收 INTEGER PRIMARY KEY
【发布时间】:2010-10-05 08:08:16
【问题描述】:

我在 python 中使用 sqlite。当我插入表 A 时,我需要从表 B 中为其提供一个 ID。所以我想做的是将默认数据插入 B,获取 id(这是自动递增的)并在表 A 中使用它。什么是最好的方法从我刚刚插入的表中接收密钥?

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    正如 Christian 所说,sqlite3_last_insert_rowid() 是您想要的……但那是 C 级 API,而您正在使用 SQLite 的 Python DB-API 绑定。

    看起来光标方法lastrowid 会做你想要的(search for 'lastrowid' in the documentation for more information)。使用cursor.execute( ... ) 插入您的行,然后执行lastid = cursor.lastrowid 之类的操作来检查最后插入的ID。

    你说你需要“一个”ID 让我很担心,不过……你拥有哪个 ID 并不重要?除非您将刚刚插入 B 的数据用于某事,在这种情况下您需要 那个 行 ID,如果您只需要表 B 的任何旧行 ID,那么您的数据库结构就会严重搞砸。

    【讨论】:

    • 一件事可能更清楚——lastrowid 为您提供行 ID,不是自动递增的主键;应该运行一个额外的查询来检索该键。
    • 其实,我最后的反对意见是错误的;见sqlite.org/autoinc.html
    • 是的,SQLite 是一个古怪的小数据库......像这样的边缘案例真的让我很欣赏 Postgres 中的 INSERT... RETURNING 等功能。
    【解决方案2】:

    查看sqlite3_last_insert_rowid()——这可能就是您要找的东西:

    SQLite 表中的每个条目都有一个 唯一的 64 位有符号整数密钥 称为“rowid”。 rowid 是 始终以未声明的形式提供 名为 ROWID、OID 或 _ROWID_ 的列 只要不使用这些名称 通过显式声明的列。如果 表有一个 INTEGER 类型的列 PRIMARY KEY 那么该列是 rowid 的另一个别名。

    此例程返回 最近成功的 INSERT 到 从数据库连接数据库 在第一个论点中。如果不 曾经发生过成功的 INSERT 在该数据库连接上,零是 返回。

    希望对您有所帮助! (有关 ROWID 的更多信息,请访问 herehere。)

    【讨论】:

    • 这肯定适用于 APSW,但我不确定符合 DB-API 的 Python 模块 (pysqlite) 是否提供对该调用的访问。
    • 在 Python 中它看起来像是被 cursor.lastrowid 包裹起来的,是的。
    【解决方案3】:

    简单使用:

    SELECT last_insert_rowid();
    

    但是,如果您有多个连接写入数据库,您可能无法取回您期望的密钥。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 2014-10-23
      • 1970-01-01
      • 2015-10-24
      • 2016-07-05
      • 2012-06-10
      • 2022-12-21
      相关资源
      最近更新 更多