最新消息:站点添加了一些不太友好的内容,请见谅...

Sequelize 更新数据库表字段

若思若想 onlyling 90浏览 0评论

Sequelize 更新数据库表字段

Sequelize

Sequelize is a promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server. It features solid transaction support, relations, eager and lazy loading, read replication and more.

背景

项目中使用 Sequelize 操作数据库查询等,通过 Sequelize 的 model 创建表。当新增、修改某些表的时候,比较麻烦。

开发阶段可以不管数据,直接 sync({ force: true }) 强制同步创建表。

线上生产环境可以手工操作数据,对于数据库的开发者,真的有点麻烦。

Sequelize 提供了迁移方案,Migrations 点击阅读文档。文档写的还是蛮简单的,跌跌撞撞才慢慢搞懂怎么玩。

准备

项目基于 Egg.js 开发,可以参考 文档 操作。

安装必要的依赖 sequelize-cli

npm install --save-dev sequelize-cli

在项目根目录创建 .sequelizerc 文件,对这次迁移的进行基本的配置。database 是迁移配置存放的文件夹。

'use strict';

const path = require('path');

module.exports = {
  config: path.join(__dirname, 'database/config.json'),
  'migrations-path': path.join(__dirname, 'database/migrations'),
  'seeders-path': path.join(__dirname, 'database/seeders'),
  'models-path': path.join(__dirname, 'app/model'),
};

初始化迁移配置。

npx sequelize init:config
npx sequelize init:migrations

init:config 会自动生成 database/config.json 文件,需要把数据库的配置信息改成项目的。

{
  "development": {
    "username": "root",
    "password": null,
    "database": "blog",
    "host": "localhost",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "blog",
    "host": "localhost",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "blog",
    "host": "localhost",
    "dialect": "mysql"
  }
}

init:migrations 会创建一个 database/migrations 文件夹,里面会放置配置文件。

迁移数据库表

第一次创建 user 表。

第一次创建比较推荐 Sequelize.sync() 的方式同步。

npx sequelize migration:generate --name=init-users

会在 database/migrations 生成一个时间戳加 init-users 的 JavaScript 文件。

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    /*
      Add altering commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.createTable('users', { id: Sequelize.INTEGER });
    */
  },

  down: (queryInterface, Sequelize) => {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.dropTable('users');
    */
  }
};

up 中是更新的操作,down 是回退的操作。

up 中,添加代码,最简单的方式,把 model 的定义操作来。

module.exports = {
    up: (queryInterface, Sequelize) => {
        const { STRING, INTEGER } = Sequelize;
        // 注意,表明根据自己的配置信息填写,注意大小写、是否有 s
        return queryInterface.createTable('users', {
            // ID
            id: {
                type: INTEGER,
                primaryKey: true,
                autoIncrement: true
            },
            // 用户名
            user_name: {
                type: STRING,
                allowNull: false,
                validate: {}
            },
            // 密码
            password: {
                type: STRING,
                allowNull: false,
                validate: {}
            }
        });
    }
}

接下来就可以迁移。

# 升级数据库
npx sequelize db:migrate
# 如果有问题需要回滚,可以通过 `db:migrate:undo` 回退一个变更
# npx sequelize db:migrate:undo
# 可以通过 `db:migrate:undo:all` 回退到初始状态
# npx sequelize db:migrate:undo:all

假设标语表之间存在关系呢?

module.exports = {
    up: (queryInterface, Sequelize) => {
        const { STRING, INTEGER } = Sequelize;
        // 注意,表明根据自己的配置信息填写,注意大小写、是否有 s
        queryInterface.createTable('users', {
            // ID
            id: {
                type: INTEGER,
                primaryKey: true,
                autoIncrement: true
            },
            // 用户名
            user_name: {
                type: STRING,
                allowNull: false,
                validate: {}
            },
            // 密码
            password: {
                type: STRING,
                allowNull: false,
                validate: {}
            }
        }).then(() => {
            return queryInterface.createTable('posts', {
                // ID
                id: {
                    type: INTEGER,
                    primaryKey: true,
                    autoIncrement: true
                },
                // 用户名
                title: {
                    type: STRING,
                    allowNull: false,
                    validate: {}
                },
                // 用户ID
                user_id: {
                    type: INTEGER,
                    allowNull: false,
                    validate: {}
                }
            });
        }).then(() => {
            // 修改字段属性
            queryInterface.changeColumn('post', 'user_id', {
                type: 'FOREIGN KEY',
                references: {
                    model: 'users',
                    field: 'id'
                }
            });

            // 新增字段
            queryInterface.addColumn('post', 'visit_count', {
                type: INTEGER,
                allowNull: false,
                defaultValue: 0
            });
        })
    }
}

查看完整的公共方法列表,它支持 QueryInterface API

参考文章

转载请注明:OnlyLing-WEB前端开发者 » Sequelize 更新数据库表字段

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. 一如既往的表示支持!
    mamayi2019-03-19 16:55 回复
  2. 隔三差五来一趟,每次都有新气象!
    妈妈易妈妈网2019-03-31 10:57 回复