繼上一篇PostgreSQL 在宣告 serial 遇到的雷我們來試試看 NodeJS 中使用 sequelize 它會不會幫我們把這個雷避掉,要避掉這個雷只要把上一次提到的 id 欄位 type 改成 bigint 就不管是 PostgreSQL 8 或是 PostgreSQL 9 都不會有這個問題了
使用 sequelize 建立使用 PostgreSQL 的專案
建立一個 NodeJS 專案
在這邊因為是範例我們用預設狀態把一個專案建立起來
mkdir sequelize-test npm init -y
安裝 sequelize 與 PostgreSQL 套件
npm install sequelize pg
初始化 sequelize
npx sequelize-cli init
修改 sequelize 使用 PostgreSQL
修改 sequelize-test/config/config.json 直接複製貼上即可
{ "development": { "username": "postgres", "password": password, "database": "database_development", "host": "127.0.0.1", "dialect": "postgres" }, "test": { "username": "root", "password": null, "database": "database_test", "host": "127.0.0.1", "dialect": "postgres" }, "production": { "username": "root", "password": null, "database": "database_production", "host": "127.0.0.1", "dialect": "postgres" } }
使用 sequelize 建立資料庫
npx sequelize-cli db:create Sequelize CLI [Node: 14.8.0, CLI: 6.2.0, ORM: 6.3.5] Loaded configuration file "config/config.json". Using environment "development". Database database_development created.
查詢資料庫列表
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ----------------------+----------+----------+------------+------------+----------------------- database_development | postgres | UTF8 | en_US.utf8 | en_US.utf8 | postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)
使用 sequelize 建立資料表
npx sequelize-cli model:generate --name user --attributes name:string Sequelize CLI [Node: 14.8.0, CLI: 6.2.0, ORM: 6.3.5] New model was created at /Users/clarence/Documents/node/sequelize-test/models/user.js . New migration was created at /Users/clarence/Documents/node/sequelize-test/migrations/20200000000000-create-user.js .
使用 sequelize migrate
npx sequelize-cli db:migrate Sequelize CLI [Node: 14.8.0, CLI: 6.2.0, ORM: 6.3.5] Loaded configuration file "config/config.json". Using environment "development". == 20200000000000-create-user: migrating ======= == 20200000000000-create-user: migrated (0.035s)
查詢資料表
database_development=# \d List of relations Schema | Name | Type | Owner --------+---------------+----------+---------- public | SequelizeMeta | table | postgres public | users | table | postgres public | users_id_seq | sequence | postgres (3 rows)
這邊發現 type 一樣是 integer 那我們再來看看 users_id_seq
database_development=# \d users Table "public.users" Column | Type | Collation | Nullable | Default -----------+--------------------------+-----------+----------+----------------------------------- id | integer | | not null | nextval('users_id_seq'::regclass) name | character varying(255) | | | createdAt | timestamp with time zone | | not null | updatedAt | timestamp with time zone | | not null | Indexes: "users_pkey" PRIMARY KEY, btree (id)
查詢 users_id_seq 可以發現 Type 是 bigint
與 Maximum 依然是 9223372036854775807
所以 sequelize 並不會幫我們修復這個問題
database_development=# \d users_id_seq Sequence "public.users_id_seq" Type | Start | Minimum | Maximum | Increment | Cycles? | Cache --------+-------+---------+---------------------+-----------+---------+------- bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1 Owned by: public.users.id
手動修復問題把 id 改成 bigint
手動修改 id 改成 bigint,要修改的檔案是 migrations/20200000000000-create-user.js,把 id 修改成如下
{ id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.BIGINT }, name: { type: Sequelize.STRING }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }
移除剛剛建立的 table
npx sequelize-cli db:migrate:undo Sequelize CLI [Node: 14.8.0, CLI: 6.2.0, ORM: 6.3.5] Loaded configuration file "config/config.json". Using environment "development". == 20200000000000-create-user: reverting ======= == 20200000000000-create-user: reverted (0.017s)
重新 migrate,並且查看 table
database_development=# \d users Table "public.users" Column | Type | Collation | Nullable | Default -----------+--------------------------+-----------+----------+----------------------------------- id | bigint | | not null | nextval('users_id_seq'::regclass) name | character varying(255) | | | createdAt | timestamp with time zone | | not null | updatedAt | timestamp with time zone | | not null | Indexes: "users_pkey" PRIMARY KEY, btree (id)
如此就可以避免前一篇的問題再發生了
參考資料
《AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC》
第 12 屆 iT 邦幫忙鐵人賽 DevOps 組冠的《用 CDK 定 義 AWS 架構》
第 11 屆 iT 邦幫忙鐵人賽《LINE bot 好好玩 30 天玩轉 LINE API》
一個熱愛分享的雲端工程師!