ย้ายจาก SQLite ไป Postgres
สิ่งที่จะได้
เว็บเดิมที่ใช้ Postgres แทน SQLite ทั้งแบบก่อนเปิดตัว (ง่าย) หรือแบบที่มีเนื้อหาที่ต้องเก็บไว้ ใช้: ฐานข้อมูล, migration, backup
SQLite เหมาะกับ server เครื่องเดียวที่มีดิสก์ ให้ย้ายไป Postgres เมื่อ deploy แบบ serverless รันหลาย server หรือ hosting มี Postgres แบบจัดการให้พร้อมระบบสำรองข้อมูล
ก่อนเปิดตัว: เปลี่ยนแล้วเริ่มใหม่
ถ้าเนื้อหาที่มีเป็นแค่เนื้อหาทดสอบ ให้เปลี่ยน adapter แล้วสร้างเนื้อหาใหม่:
npm install @easy-cms/db-postgres @electric-sql/pglitepnpm add @easy-cms/db-postgres @electric-sql/pgliteyarn add @easy-cms/db-postgres @electric-sql/pglitebun add @easy-cms/db-postgres @electric-sql/pgliteimport { postgres } from '@easy-cms/db-postgres'
db: process.env.DATABASE_URL
? postgres({ url: process.env.DATABASE_URL })
: postgres({ pglite: '.pglite' }), // Postgres ในโฟลเดอร์ ไม่ต้องมี servermigration เขียนด้วย SQL ของฐานข้อมูลแบบใดแบบหนึ่ง จึงต้องสร้างใหม่แทนของ SQLite:
rm -r easy-cms/migrations
npx easy-cms migrate:create initrm -r easy-cms/migrations
pnpm exec easy-cms migrate:create initrm -r easy-cms/migrations
yarn easy-cms migrate:create initrm -r easy-cms/migrations
bunx easy-cms migrate:create initcommit โฟลเดอร์ใหม่ รัน npx easy-cms migrate ในที่ที่ deploy และสร้าง admin คนแรกใหม่ (npx easy-cms create-admin)
แบบมีเนื้อหาที่ต้องเก็บไว้
easy-cms copy ย้ายทุกอย่าง: เอกสาร เวอร์ชัน ผู้ใช้ (จึง login ได้เหมือนเดิม) global และงานตั้งเวลา id ยังเหมือนเดิม relationship จึงยังชี้ไปที่เอกสารที่ถูกต้อง
สำรองข้อมูลก่อน:
npx easy-cms backup backups/before-postgres.dbเก็บ config ของฐานข้อมูลเก่าไว้ สร้าง
easy-cms.old.config.tsข้าง config หลัก ใช้ทุกอย่างเหมือนเดิม และเปลี่ยนแค่db:tsimport { sqlite } from '@easy-cms/db-sqlite' import config from './easy-cms.config' export default { ...config, db: sqlite({ url: 'file:./cms.db' }) }ให้ config หลักชี้ไปที่ Postgres ตามหัวข้อด้านบน แล้วสร้าง migration ของ Postgres (
rm -r easy-cms/migrations && npx easy-cms migrate:create init)เตรียมฐานข้อมูลใหม่ ในเครื่อง (PGlite หรือตั้ง
DATABASE_URLไว้) ขั้นถัดไปจะสร้างตารางให้เอง ถ้าเป็นฐานข้อมูล production ให้รันNODE_ENV=production npx easy-cms migrateพร้อมDATABASE_URLของมันก่อนคัดลอก ในช่วงที่ไม่มีใครแก้เนื้อหา:
bashnpx easy-cms copy --from easy-cms.old.config.ts # Copying from sqlite (easy-cms.old.config.ts) to postgres… # ecms_users: 3 # ecms_posts: 42 # … # Copied 318 row(s) from 17 table(s).bashpnpm exec easy-cms copy --from easy-cms.old.config.ts # Copying from sqlite (easy-cms.old.config.ts) to postgres… # ecms_users: 3 # ecms_posts: 42 # … # Copied 318 row(s) from 17 table(s).bashyarn easy-cms copy --from easy-cms.old.config.ts # Copying from sqlite (easy-cms.old.config.ts) to postgres… # ecms_users: 3 # ecms_posts: 42 # … # Copied 318 row(s) from 17 table(s).bashbunx easy-cms copy --from easy-cms.old.config.ts # Copying from sqlite (easy-cms.old.config.ts) to postgres… # ecms_users: 3 # ecms_posts: 42 # … # Copied 318 row(s) from 17 table(s).ปลายทางต้องว่าง ถ้าเผลอรันซ้ำจึงไม่มีอะไรเปลี่ยน
ตรวจเว็บ: เปิดหน้า admin เอกสารที่มี relationship และรูป ประวัติของบทความ และลอง login
ไฟล์อัปโหลดไม่ต้องย้าย ไฟล์ยังอยู่ใน uploads/ หรือ bucket และเอกสารยังชี้ไปที่ไฟล์เดิม เมื่อเว็บบน Postgres ทำงานดีแล้ว ลบ easy-cms.old.config.ts ได้ (เก็บไฟล์สำรองไว้สักพัก)
คำสั่งเดียวกันใช้กลับทางได้ด้วย คือจาก Postgres ไป SQLite