Node.js 中的数据库迁移:工具概览与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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                    

推荐