Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

馨房 DEV LOG 之种子数据库 (初始化数据) #26

Open
yeojongki opened this issue Jan 27, 2020 · 0 comments
Open

馨房 DEV LOG 之种子数据库 (初始化数据) #26

yeojongki opened this issue Jan 27, 2020 · 0 comments

Comments

@yeojongki
Copy link
Owner

一、如何设置 / 修改种子数据

项目刚开始时候我们通常需要在数据库里造一些初始化数据或者说种子数据(如管理员账号密码等)。通常有如下解决方案:

  1. 设置一个后台管理页面,提供可视化配置

  2. 直接在数据库中写入数据

  3. 提前定义好数据格式 ( 如 JSON / TXT 文件等),通过某种方式导入到数据库中

二、我的思考

  1. 初始化管理员的账号应该直接在数据库写入,我项目中的后台管理没有初始化账号这一步骤(不过正常来说应该是要的?)
  2. 后续的修改可以进入管理后台修改
  3. 怎么将初始化的数据导出,以便再另一台机器中导入(重要
  4. 可以执行脚本完成导入,减少工作量(偷懒)

三、我的解决方案

  1. 初始化时候直接在数据库设置好管理员的账号密码 & 管理员角色 & 权限
  2. 进入管理后台 -> 创建其他角色 & 权限 & 其他初始化设置 (可视化)
  3. 设置完基本数据后将这些数据导出为 sql 文件,数据库迁移时候执行导入数据

四、导入数据关键步骤

利用 child_process 执行脚本,利用 mysql -e 执行命令

// initDB.js
const { DB_NAME, DB_USERNAME, DB_PASSWORD, DB_PORT, DB_HOST, DB_CHARSET, DB_COLLATE } = getConfig();

// runCmd 是 child_process 的 spawan 封装后的函数
runCmd('mysql', [
  `-h${DB_HOST}`,
  `-u${DB_USERNAME}`,
  `-p${DB_PASSWORD}`,
  `-P${DB_PORT}`,
  `-e DROP DATABASE IF EXISTS \`${DB_NAME}\`;`, // 先将数据库移除
  `-e CREATE DATABASE \`${DB_NAME}\` DEFAULT CHARACTER SET ${DB_CHARSET} COLLATE ${DB_COLLATE};`, // 重新创建数据库
  `-e USE \`${DB_NAME}\`;`,
  `-e SHOW DATABASES;`,
  `-e SOURCE \.\/scripts\/seed\.sql;`, // 导入种子数据
])

然后在 package.json 中写入命令

{

  "scripts": {

    "seed:dev": "cross-env NODE_ENV=development node scripts/initDB.js",

    "seed:prod": "cross-env NODE_ENV=production node scripts/initDB.js"

  }

}

执行相关命令就可以方便修改数据了 ✌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant