javascripthfpp2012发表于*编辑于

1. 介绍

我是一个rails程序员,最近在学习nodejs方面的开发,准备做一个项目之前,可能需要创建数据库方面的东西,比如创建一些表,可能还会添加一些字段,加上索引等。如果你也是一个rails程序员,你肯定对migration这个东西不陌生,它可以被翻译为"迁移",不过它不是把数据库的数据从一个地方迁移到另一个地方,而是在开发过程中,能够管理你的数据库改变工作,就是用工具和代码来管理数据库改变,比如,你现在要添加一张users表,你可以会运行下面的命令:

$ rails g migration create_users name:string email:string

它会生成一个文件,也叫迁移脚本,它的内容如下:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email
    end
  end
end

之后运行命令bundle exec rake db:migrate就会在数据库中添加一张users表,字段分别为name和email。

这样的方式是最好的,因为也适合在生产环境上不断地增量修改数据库,也能把修改的内容以迁移脚本的形式保留下来,方便维护查看,至少比那种手动修改数据库的low方式好多了,那种改了之后,还生成一个sql脚本,让你导,实在太low了。

然后,这节的重点不是rails,而是nodejs,它也有这样的工具,我找到了一个,一直在更新,且是比较好的,介绍给大家使用。

https://github.com/db-migrate/node-db-migrate

2. 安装

首先来安装,安装很简单,先确保你电脑上有npm吧,这是最基本的。

$ npm install -g db-migrate

安装完之后,就可以使用db-migrate命令了。

3. 使用

首先创建一个文件database.json,这个文件是放数据库配置的,你的数据库账号名和密码都是放在上面的。

接着创建一个migrations目录,它是放迁移脚本的。

打开database.json文件,添加内容如下:

{
  "dev": {
    "driver": "pg",
    "user": "hfpp2012",
    "password": "",
    "host": "localhost",
    "schema": "public"
  }
}

其中dev是指开发环境,这个名称是可以修改的,默认就是dev开发环境,也就是说,你如果不指定命令参数运行的话(下面会提到),就是这个环境,除此之外,还有两个环境test, prod,分别代表测试环境和生产环境,这点跟rails的是没多大区别的。

userpassword当然分别是你的数据库的用户名和密码了,你填上你自己的,driver是数据库驱动,pg代表的是postgresql数据库。

当然你也可以使用其他的数据库,详情可查看这篇文档:https://db-migrate.readthedocs.io/en/latest/Getting%20Started/configuration/

使用pg数据库,还需要安装另一个工具:

$ npm install -g db-migrate-pg

现在我们先来创建一个数据库,执行下面的命令:

$ db-migrate db:create koa_dev

会这样输出:

[INFO] Created database "koa_dev"

创建成功了,创建的数据库名称为koa_dev

再把刚才的数据库名称写到database.json配置文件中。

{
  "dev": {
    "driver": "pg",
    "user": "hfpp2012",
    "password": "",
    "host": "localhost",
    "database": "koa_dev",
    "schema": "public"
  }
}

现在我们就可以在上面创建表之类的,先创建一个迁移脚本。

$ db-migrate create create-users

create-users是你迁移脚本的名称,你可以改成你自己需要的,只要语义化就好,比如add_phone_to_users,很容易看出是添加一个叫phone的字段给users表。

会输出如下信息:

[INFO] Created migration at /Users/hfpp2012/codes/koa/migrations/20161221080001-create-users.js

打开这个文件,修改内容如下:

exports.up = function(db) {
  return db.createTable('users', {
    id: { type: 'int', primaryKey: true },
    name: 'string',
    email: 'string'
  });
};

exports.down = function(db) {
  return db.dropTable('users');
};

其中,id为整型类似,为主键,还有两个字段分别是前面提到的nameemail

再执行以下命令,执行这个迁移脚本。

$ db-migrate up

你可以进数据库查看效果,是不是生成了这张表,我是在mac下。

$ psql koa_dev
# 之后执行` \d users`命令
koa_dev=# \d users;
          Table "public.users"
 Column |       Type        | Modifiers 
--------+-------------------+-----------
 id     | integer           | not null
 name   | character varying | 
 email  | character varying | 
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)

创建成功了!

如果这个时候你发现创建的表不对,要重新创建,你可以回退,只要执行下面这个命令即可。

$ db-migrate down

再进入数据库查看。

koa_dev=# \d users;
Did not find any relation named "users".

表被删除掉了,你现在可以修改一下迁移脚本,再次执行db-migrate up就又可以创建users表。

更多的命令可以查看这篇文档,比如,你要重做,回退到某个版本,你有需要的时候就去查看吧。

上面的users表有一个int类似的字段id,也有string类型的字段nameemail,其实string类型就是varchar。如果还需要其他类似的字段,就查看这个文件,里面都有,https://github.com/db-migrate/shared/blob/master/data_type.js。

创建表你学会了,那如果要添加一个字段,或修改表名,或添加索引,也是一样的,参考这篇文章:https://db-migrate.readthedocs.io/en/latest/API/SQL/。

比如这样:

exports.up = function(db) {
  return db.createTable('regional_designs', {
    id: { type: 'int', primaryKey: true },
    name: 'string',
    type: 'string',
    pos_x: 'int',
    pos_y: 'int',
    parent_id: 'int',
    drug_id: 'int',
    created_at: 'timestamp',
    updated_at: 'timestamp'
  }).then(
    function(result) {
      db.addIndex('regional_designs', 'regional_designs_parent_id_key', ['parent_id'], function(err) {
        return;
      });
    },
    function(err) {
      return;
    }
  ).then(
    function(result) {
      db.addIndex('regional_designs', 'regional_designs_drug_id_key', ['drug_id'], function(err) {
        return;
      });
    },
    function(err) {
      return;
    }
  );
};

exports.down = function(db) {
  return db.dropTable('regional_designs');
};

完结。