JavaScript (Node.js) 中的数据库迁移:工具与实践
现代 Node.js Web 应用程序的开发很少能不涉及数据库。随着项目的增长,表结构、索引和关系不可避免地会发生变化。在服务器上手动执行 SQL 脚本是导致混乱和错误的途径。解决这个问题的方法是数据库迁移。这是一种模式变更的版本控制机制,允许开发团队同步且安全地更新数据库结构。
在 JavaScript 生态系统中,有几种成熟的工具可用于处理迁移。让我们通过流行的库来探讨三种关键方法。
1. Knex.js — 通用查询构建器
Knex.js 不仅仅是一个 SQL 构建器,还是一个功能齐全的迁移和数据填充工具。它支持 PostgreSQL、MySQL、SQLite 和其他数据库管理系统。主要优势在于您用 JavaScript 编写迁移,而 Knex 会将其转换为特定数据库的方言。
安装与配置
npm install knexnpm install pg # 用于 PostgreSQL创建配置文件 knexfile.js:
module.exports = { development: { client: 'pg', connection: { host: 'localhost', user: 'user', password: 'pass', database: 'mydb' }, migrations: { directory: './migrations' } }};创建与执行迁移
为用户表创建一个迁移:
npx knex migrate:make create_users_table在 migrations 文件夹中会出现一个带有时间戳的文件。编辑它:
exports.up = function(knex) { return knex.schema.createTable('users', (table) => { table.increments('id').primary(); table.string('username', 100).notNullable().unique(); table.string('email').notNullable(); table.timestamps(true, true); // created_at 和 updated_at });};
exports.down = function(knex) { return knex.schema.dropTableIfExists('users');};应用迁移:
npx knex migrate:latest回滚上一次迁移:
npx knex migrate:rollback如果需要特定的逻辑,Knex 还允许在迁移中执行纯 SQL。
2. Sequelize — 具有强大迁移系统的 ORM
Sequelize 是 Node.js 流行的 ORM,支持 PostgreSQL、MySQL、MariaDB、SQLite 和 MSSQL。其 CLI 提供了便捷的命令来生成和管理与模型紧密集成的迁移。
开始使用
npm install sequelize sequelize-cli pgnpx sequelize-cli init通过一条命令创建模型和迁移:
npx sequelize-cli model:generate --name User --attributes username:string,email:string这将生成两个文件:models/user.js 模型和 migrations/ 中的迁移。迁移示例:
'use strict';module.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.createTable('Users', { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, username: { type: Sequelize.STRING(100), allowNull: false, unique: true }, email: { type: Sequelize.STRING, allowNull: false }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('Users'); }};应用与回滚:
npx sequelize-cli db:m