likes
comments
collection
share

CMS系统开发-egg链接sqlite数据库

作者站长头像
站长
· 阅读数 9

为了简单,各种软件和库的名称我就不区分大小写了。

说下为什么使用sqlite,我在选择sqlite前使用了mysql、mongodb这两款数据库,他们很成熟很强大,但是配置起来对于新手要费点时间,考虑到我想要开发CMS是一个很轻量的系统,使用这两个数据库感觉太重了。关键是sqlite功能少学起来也简单。

通常操作数据库都会选择一个ORM,通过ORM去操作数据库,可以有效避免SQL注入安全问题,操作起来也比直接写SQL简单,这里选择egg-orm,基于leoric封装的。

首先安装相关依赖

yarn add egg-orm sqlite3 @journeyapps/sqlcipher --save

在plugin中启用插件

module.exports = {
  // had enabled by egg
  static: {
    enable: true,
  },
  orm: {
    enable: true,
    package: 'egg-orm',
  },
};

在config.default.js中配置数据库信息

     // 数据库
     const userConfig = {
        orm: {
          client: '@journeyapps/sqlcipher', // 数据加密
          dialect: 'sqlite',
          database: appInfo.baseDir + '/database/data.db', // 数据存放位置
          connectionLimit: 10, // 连接池数量
        },
    }

完成以上配置后,在egg项目的app.js中,serverDidReady钩子里设置表模型同步,这样在应用启动后,表会根据模型自动创建和更新

async serverDidReady() {
    await this.app.model.sync({ alter: true });
    // http / https server 已启动,开始接受外部请求
    // 此时可以从 app.server 拿到 server 的实例
  }

现在就可以编写代码了,现在model目录中定义一个表结构

module.exports = function(app) {
  const { Bone, DataTypes: { STRING, INTEGER } } = app.model;
  // console.log(Realm)
  class User extends Bone {
    static table = 'user'

    static attributes = {
      name: STRING,
      password: STRING,
    }
  };
  return User
}

然后在controller中写增删改查

'use strict';

const { Controller } = require('egg');

class HomeController extends Controller {
  async list() {
    const { ctx } = this;
    const list = await ctx.model.User.find();
    console.log(list);

    ctx.body = list;
  }

  async create() {
    const { ctx } = this;
    await ctx.model.User.create({
      password: '123456',
      name: 'wmui',
    });

    ctx.body = {
      success: true,
    };
  }

  async update() {
    const { ctx } = this.ctx;
    const i = await ctx.model.User.update({
      name: 'wmui',
    }, {
      password: '12345678',
    });

    console.log(i);
    ctx.body = {
      success: true,
    };
  }

  async remove() {
    const { ctx } = this.ctx;
    const i = await ctx.model.User.remove({
      name: 'wmui',
    });

    console.log(i);
    ctx.body = {
      success: true,
    };
  }
}

module.exports = HomeController;

完成数据库连接是开始的第一步,后面就可以愉快的实现逻辑了。

如果对egg和sql不太熟悉,上面代码看起来可能有点吃力,可以看下官方的文档简单动手实践一下,egg使用起来很是挺方便的。