Knex :获取最后插入的 id 的通用方法
Knex : universal way to get the last inserted id
我正在使用 Knex,因为我正在开发一个我想与多个数据库服务器一起使用的应用程序,目前是 Sqlite3、Postgres 和 MySQL。
我意识到这可能比我预期的更难。
在 MySQL 上,似乎此语法将 return 具有 id 的数组:
knex('table').insert({ field: 'value'}, 'id');
在 postgres 上我需要这样的东西:
knex('table').insert({ field: 'value'}, 'id').returning(['id']);
在每种情况下,它们的结构 return 都不同。后者不会中断 MySQL,但在 SQlite 上它会抛出一个致命错误。
'insert a record, get an id' 的概念似乎无处不在。我在 Knex 中缺少什么让我一次编写并在任何地方使用?
早在 2007 年,我就为 PHP 框架实现了数据库访问 class。它支持 MySQL、PostgreSQL、SQLite、Microsoft SQL Server、Oracle 和 IBM DB2。
当需要支持 auto-incremented 列时,我发现 所有 这些实现该功能的方式不同。有的SERIAL
,有的AUTO-INCREMENT
(或AUTOINCREMENT
),有的SEQUENCE
,有的GENERATED
,有的支持多解
解决方案是不要尝试编写一个适用于所有这些的实现。我使用 Adapter Pattern 编写了 classes,每个品牌的 SQL 数据库一个,因此我可以实现每个适配器 class 以适应各自数据库支持的功能。适配器满足我在我的框架中定义的接口,以允许定义主键列并以一致的方式获取最后插入的 id。但内部实现各不相同。
在我看来,这是开发该代码的唯一明智的方法。当涉及到 SQL 实现的变体时,认为可以开发适用于多个品牌的“可移植”代码是一种谬论。
我正在使用 Knex,因为我正在开发一个我想与多个数据库服务器一起使用的应用程序,目前是 Sqlite3、Postgres 和 MySQL。
我意识到这可能比我预期的更难。
在 MySQL 上,似乎此语法将 return 具有 id 的数组:
knex('table').insert({ field: 'value'}, 'id');
在 postgres 上我需要这样的东西:
knex('table').insert({ field: 'value'}, 'id').returning(['id']);
在每种情况下,它们的结构 return 都不同。后者不会中断 MySQL,但在 SQlite 上它会抛出一个致命错误。
'insert a record, get an id' 的概念似乎无处不在。我在 Knex 中缺少什么让我一次编写并在任何地方使用?
早在 2007 年,我就为 PHP 框架实现了数据库访问 class。它支持 MySQL、PostgreSQL、SQLite、Microsoft SQL Server、Oracle 和 IBM DB2。
当需要支持 auto-incremented 列时,我发现 所有 这些实现该功能的方式不同。有的SERIAL
,有的AUTO-INCREMENT
(或AUTOINCREMENT
),有的SEQUENCE
,有的GENERATED
,有的支持多解
解决方案是不要尝试编写一个适用于所有这些的实现。我使用 Adapter Pattern 编写了 classes,每个品牌的 SQL 数据库一个,因此我可以实现每个适配器 class 以适应各自数据库支持的功能。适配器满足我在我的框架中定义的接口,以允许定义主键列并以一致的方式获取最后插入的 id。但内部实现各不相同。
在我看来,这是开发该代码的唯一明智的方法。当涉及到 SQL 实现的变体时,认为可以开发适用于多个品牌的“可移植”代码是一种谬论。