【问题标题】:Get the ID of a new entry using Sequelize and SQLite without auto increment使用 Sequelize 和 SQLite 获取新条目的 ID,无需自动递增
【发布时间】:2019-02-16 20:57:25
【问题描述】:

我想将 Node.js 与 Sequelize 和 SQLite 一起使用。我有以下用户模型:

const User = sequelize.define('user', {
  rowid: {
    type: 'INTEGER',
    primaryKey: true,
  },
  // other properties
});

如果我现在执行const newUser = await User.create({ /* properties */ }),我希望能够使用newUser.rowid 访问新用户的ID。但事实并非如此,除非我将autoIncrement: true 添加到规范中。关注https://www.sqlite.org/autoinc.html,我不想这样做。还有其他可能吗?

编辑

事实证明,这只有通过创建没有autoIncrement: true 的表才能实现,然后才将其添加到列定义中。更实用的方法可能是只使用自动增量,对于大多数小型应用程序来说,性能下降并不重要。

【问题讨论】:

    标签: node.js sqlite sequelize.js


    【解决方案1】:

    您不必使用autoincrement 来访问表User 中的rowid。我希望以这种方式看到它User.rowid 而不是newUser.rowid 就像示例中那样,因为表名(显然)是User

    同样来自 sqlite 文档:

    如果 rowid 表的主键由单列组成 并且该列的声明类型是“INTEGER”的任何混合 大写和小写,则该列成为 rowid 的别名。 这样的列通常称为“整数主键”。一种 PRIMARY KEY 列仅在声明的情况下才成为整数主键 类型名称正是“INTEGER”。

    最后,您可能会为 PK 考虑一个不同于 rowid 的名称,因为 sqlite 已经有一个 rowid

    除了 WITHOUT ROWID 表,SQLite 表中的所有行都有一个 64 位有符号整数密钥,唯一标识其内的行 桌子。这个整数通常称为“rowid”。 rowid 值可以 使用与特殊情况无关的名称“rowid”之一进行访问, “oid”或“rowid”代替列名。如果一个表包含一个 用户定义的列名为“rowid”、“oid”或“rowid”,然后是该名称 总是引用显式声明的列,不能用于 检索整数 rowid 值。

    【讨论】:

    • 感谢您的帮助。问题不在于一般访问rowid,而是在创建新用户后直接访问它,而无需使用find 之类的东西重新加载它。事实证明,这是不可能的,因为如果设置了 autoIncrement,Sequelize 只会将主键替换为 lastInsertId
    • @FelixSchütz 你从哪里得到这个“因为如果设置了 autoIncrement,Sequelize 只会用 lastInsertId 替换主键。”我检查了他们的文件,但找不到。我面临着我在这里提出的同样的问题。
    • @Qiulang 我刚刚尝试了以下方法: 1. 从不自动递增的模式创建表。存储在数据库中的模式没有设置自动增量,并且在创建条目后没有设置主键。 2. 从没有自动增量的模式创建表,然后启用自动增量。存储在数据库中的模式没有设置自动增量,但主键是在创建条目后设置的。 3. 从具有自动增量的模式创建表。存储在数据库中的模式设置了自动增量,并且在创建条目后设置了主键。
    猜你喜欢
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多