前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库

【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库

作者头像
一尾流莺
发布2022-12-10 13:48:56
5900
发布2022-12-10 13:48:56
举报

连接并新建本地数据库

打开 workbench ,点击按钮连接数据库

image.png
image.png

填写数据库名称,其它默认即可

image.png
image.png

点击此处填写密码

image.png
image.png

填写安装时候设置的密码,然后点击 ok

image.png
image.png

点击测试一下连接

image.png
image.png

显示 successfully 就是成功了

image.png
image.png

关闭弹窗,点击 ok

image.png
image.png

这就是我们刚刚添加的数据库了,点击就可以查看

image.png
image.png

点击这个图标进行数据库的添加

image.png
image.png

输入数据库名称,选择编码方式,点击 apply

image.png
image.png

继续点击 apply

image.png
image.png

点击 finish

image.png
image.png

点击这里 ,就可以看到刚才新建的数据库了

image.png
image.png

这就是刚新建的数据库

image.png
image.png

右键新建的数据库,点击 Set as Default Schema 设置为此次连接的默认数据库。

image.png
image.png

使用 mysql2 测试数据库连接

安装 mysql2

代码语言:javascript
复制
npm i mysql2 sequelize -S

数据库配置文件

代码语言:javascript
复制
// src\config\envs\dev.js

module.exports = {
  // mysql 的配置
  mysqlConfig: {
    host: 'localhost',
    user: 'root',
    password: 'xiaowei123',
    port: '3306',
    database: "imooc_logo_course"
  }
}

mysql2 连接测试

代码语言:javascript
复制
// src\db\mysql2.js

const mysql = require('mysql2/promise')
const { mysqlConfig } = require('../config/envs/dev')

// mysql2 连接测试
async function testMysqlConn() {
  const connection = await mysql.createConnection(mysqlConfig)
  const [rows] = await connection.execute('select now();')
  return rows
}

// 可直接执行 node src/db/mysql2.js 进行测试
; (async () => {
  const rows = await testMysqlConn()
  console.log('🚀🚀 ~ rows', rows);
})()

module.exports = testMysqlConn

控制台执行 node src/db/mysql2.js ,打印当前时间说明数据库连接测试成功

image.png
image.png

然后我们来写一个路由进一步测试

代码语言:javascript
复制
// src\routes\index.js

const router = require('koa-router')()
const packageInfo = require('../../package.json')
const testMysqlConn = require('../db/mysql2')
const ENV = require('../utils/env')

// 测试数据库连接
router.get('/api/db-check', async (ctx) => {
  // 测试 mysql 数据库连接
  const mysqlRes = await testMysqlConn()
  ctx.body = {
    errno: 0,
    data: {
      name: 'biz editor server',
      version: packageInfo.version,
      ENV,
      mysqlConn: mysqlRes.length > 0
    }
  }
})

module.exports = router
代码语言:javascript
复制
// src\utils\env.js

// 环境变量
const ENV = process.env.NODE_ENV || ''
module.exports = {
  ENV,
  isPrd: ENV === 'production',
  isPrdDev: ENV === 'prd_env',
  idDev: ENV === 'dev',
  isTest: ENV.indexOf('test') === 0,
  isTestLocal: ENV === 'test_local',
  isTestRemote: ENV === 'test_remote'
}

执行 npm run start 把服务开启,然后访问 http://localhost:3000/api/db-check,结果如下,说明服务器连接成功了。

image.png
image.png

使用 Sequelize 测试数据库连接

配置 sequelize ,连接 mysql

代码语言:javascript
复制
// src\db\seq\seq.js

const Sequelize = require("sequelize")
const { mysqlConfig } = require('../../config/envs/dev')
const { isPrd, isTest } = require('../../utils/env')

// 连接配置
const { database, user, password, host, port } = mysqlConfig
const conf = {
  host,
  port,
  dialect: 'mysql'
}

// 测试环境不打印日志
if (isTest) {
  conf.logging = () => { } // 默认是 console.log
}

// 线上环境使用连接池
if (isPrd) {
  conf.pool = {
    max: 5, // 连接池中最大连接数量
    min: 0, // 连接池中最小连接数量
    idle: 1000, // 如果一个线程 10s 内没有被使用过的话, 就释放线程
  }
}

// 创建连接
const seq = new Sequelize(database, user, password, conf)

module.exports = seq

数据库连接测试

代码语言:javascript
复制
// src\db\seq\utils\conn-test.js

const seq = require('../seq')

// 测试连接, 直接运行 node src/db/seq/utils/conn-test.js
seq.authenticate()
  .then(() => {
    console.log('🚀🚀 ~ ok');
  })
  .catch(() => {
    console.log('🚀🚀 ~ fail',);
  })
  .finally(() => {
    console.log('🚀🚀 ~ finally',);
    process.exit()
  })

控制台执行 node src/db/seq/utils/conn-test.js ,打印 ok 说明数据库连接测试成功

image.png
image.png

模型和数据表的同步

需要在服务启动之前同步数据库,然后再启动服务

代码语言:javascript
复制
// bin\www

var syncDb = require('../src/db/seq/utils/sync-alter.js')

// 先同步 mysql 数据表
syncDb().then(() => {
  server.listen(port);
  server.on('error', onError);
  server.on('listening', onListening);
})

同步数据库的业务代码,以修改数据表的方式,不会清空数据,比较安全

代码语言:javascript
复制
// src\db\seq\utils\sync-alter.js

const path = require('path')
const simpleGit = require('simple-git')
const seq = require('../seq')
const { isDev } = require('../../../utils/env')

// 获取所有 seq model
require('require-all')({
  dirname: path.resolve('src', 'models'), // src/models 中可能会有 mongoose 的 model ,不过这里获取了也没关系
  filter: /\.js$/,
  excludeDirs: /^\.(git|svn)$/,
  recursive: true, // 递归
})

// 同步数据表
async function syncDb() {
  let needToSyncDb = true

  // 只适用于开发环境!!!
  if (isDev) {
    // 开发环境下,修改频繁,每次重启都同步数据表,消耗太大
    // 所以,开发环境下,判断是否修改了 src/models 中的内容?
    // 如果是,则同步数据表。否则,不用同步数据表。

    const git = simpleGit()
    // 获取 git status 修改的文件,modified 格式如  [ '.gitignore', 'package.json', 'src/models/README.md' ]
    const { modified, not_added: nodeAdded, created, deleted, renamed } = await git.status()
    const fileChanged = modified
      .concat(nodeAdded)
      .concat(created)
      .concat(deleted)
      .concat(renamed)
    if (fileChanged.length) {
      // 到此,说明 git status 有改动

      // 是否改动了 db 相关的文件
      const changedDbFiles = fileChanged.some(f => {
        // 改动了 src/models ,需要同步数据库
        if (f.indexOf('src/models/') === 0) return true
        // 改动了 src/db/seq ,需要同步数据库
        if (f.indexOf('src/db/seq/') === 0) return true
        // 其他情况,不同步
        return false
      })
      // 没改动 db 文件,则不需要同步
      if (!changedDbFiles) needToSyncDb = false
    }

    // 如果 git status 没有改动,则照常同步数据表,重要!!!
  }

  if (needToSyncDb) {
    await seq.sync({ alter: true })
  }
}

module.exports = syncDb

创建数据模型

封装 sequelize 类型

代码语言:javascript
复制
// src\db\seq\types.js
const Sequelize = require('sequelize')

module.exports = {
  STRING: Sequelize.STRING, // VARCHAR(255)
  TEXT: Sequelize.TEXT, // TEXT
  INTEGER: Sequelize.INTEGER,
  BOOLEAN: Sequelize.BOOLEAN,
  DATE: Sequelize.DATE,
}

测试创建一个 user module

代码语言:javascript
复制
// src\models\UserModel.js

const seq = require('../db/seq/seq')
const { STRING, DATE, BOOLEAN } = require('../db/seq/types')

const User = seq.define('user', {
  username: {
    type: STRING,
    allowNull: false,
    unique: 'username', // 不要用 unique: true, https://www.chaoswork.cn/1064.html
    comment: '用户名,唯一',
  },
  password: {
    type: STRING,
    allowNull: false,
    comment: '密码',
  },
  phoneNumber: {
    type: STRING,
    allowNull: false,
    unique: 'username',
    comment: '手机号,唯一',
  },
  nickName: {
    type: STRING,
    comment: '昵称',
  },
  gender: {
    type: STRING,
    allowNull: false,
    defaultValue: 0,
    comment: '性别(1 男性,2 女性,0 保密)',
  },
  picture: {
    type: STRING,
    comment: '头像,图片地址',
  },
  city: {
    type: STRING,
    comment: '城市',
  },
  latestLoginAt: {
    type: DATE,
    defaultValue: null,
    comment: '最后登录时间',
  },
  isFrozen: {
    type: BOOLEAN,
    defaultValue: false,
    comment: '用户是否冻结',
  },
})

module.exports = User

执行 npm run dev, 启动服务

image.png
image.png

可以看到这个时候数据库已经有 users 表了。

image.png
image.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 连接并新建本地数据库
  • 使用 mysql2 测试数据库连接
  • 使用 Sequelize 测试数据库连接
    • 数据库连接测试
      • 模型和数据表的同步
        • 创建数据模型
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档