我正在使用 Knex,因為我正在開發一個我想與多個資料庫服務器一起使用的應用程式,目前是 Sqlite3、Postgres 和 MySQL。
我意識到這可能比我預期的更困難。
在 MySQL 上,這種語法似乎會回傳一個帶有 id 的陣列:
knex('table').insert({ field: 'value'}, 'id');
在 postgres 我需要這樣的東西:
knex('table').insert({ field: 'value'}, 'id').returning(['id']);
在每種情況下,它們回傳的結構都是不同的。后者不會破壞 MySQL,但在 SQlite 上會拋出致命錯誤。
不過,“插入記錄,獲取 id”的概念似乎無處不在。我在 Knex 中缺少什么讓我可以撰寫一次并在任何地方使用?
uj5u.com熱心網友回復:
早在 2007 年,我就為 PHP 框架實作了資料庫訪問類。它支持 MySQL、PostgreSQL、SQLite、Microsoft SQL Server、Oracle 和 IBM DB2。
當需要支持自動遞增的列時,我發現所有這些都以不同的方式實作該功能。有些有SERIAL,有些有AUTO-INCREMENT(或AUTOINCREMENT),有些有SEQUENCE,有些有GENERATED,有些支持多種解決方案。
解決方案是不要嘗試撰寫一種適用于所有這些的實作。我使用Adapter Pattern撰寫了類,每個品牌的 SQL 資料庫都有一個,因此我可以實作每個配接器類,以適應各自資料庫支持的特性。配接器滿足我在框架中定義的介面,以允許定義主鍵列并以一致的方式獲取最后插入的 id。但內部實作各不相同。
在我看來,這是開發該代碼的唯一明智的方法。當談到 SQL 實作的變體時,可以開發適用于多個品牌的“可移植”代碼是一種謬論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/463253.html
標籤:mysql 节点.js PostgreSQL sqlite 膝盖
