【AdonisJS】Node.js后端开发框架-使用ORM功能及连接MySQL数据库

本文涉及框架的版本如下:
1、Node.js:8.1.2
2、Vue.js:2.0
3、AdonisJS:AdonisJS 5
官网:https://docs.adonisjs.com/guides/models/introduction

一、ORM

Lucid的数据模型层可以让执行CRUD操作、管理模型之间的关系以及定义生命周期的钩子函数变得简单

1、创建Model

首先cmd进入项目的根目录,输入命令node ace make:model User将会在创建 app/Models/User.ts;如果使用node ace make:model User -m将会创建database/migrations/1618903673925_users.ts 用来作为创建数据库的脚本。

2、然后编写数据库实体类

代码如下:

点击查看代码
import { DateTime } from 'luxon'
import { v4 as uuidv4 } from 'uuid';

import { beforeSave,beforeCreate,BaseModel, column } from '@ioc:Adonis/Lucid/Orm'
import Hash from '@ioc:Adonis/Core/Hash'


export default class User extends BaseModel {
  @column({ isPrimary: true })
  public id: string

  @column()
  public nickName: string

  @column()
  public phone: string

  @column({ serializeAs: null })
  public pass: string
  public token :string
  @column()
  public address: string | null

@beforeSave()
  public static async hashPassword(user: User) {
    if (user.$dirty.pass) {
      user.pass = await Hash.make(user.pass)
    }
     if (user.id == null || user.id ==undefined){
       user.id = uuidv4();
     }
     
  }


  @beforeCreate()
    public static assignUuid(user: User) {
      user.id = uuidv4();
    }

 // @column.dateTime({ autoCreate: true})
 //  public updatedAt: DateTime



}

1、@Column:用于修饰数据库的列,如果没有修饰将不会序列化到结果中,在模型中定义的任何选项都不会更改/影响数据库。
2、isPrimary :用来标识是否是主键
3、serializeAs:用来控制是否序列化
4、@beforeCreate(),@beforeSave():钩子函数,在实例化,保存到数据库前进行一些操作,我这是用来生成id和加密密码(需要进行安装相关的包)
5、@column.dateTime({ autoCreate: true, autoUpdate: true }):日期,里面参数是是否自动生成与更新

3、安装Hash,uuid的包

(1) npm i Hash
(2) npm i uuid
然后import该包 import { v4 as uuidv4 } from 'uuid';import Hash from '@ioc:Adonis/Core/Hash'
使用如下:

点击查看代码
 user.id = uuidv4();
 user.pass = await Hash.make(user.pass)
	

4、增删改查操作

这些代码都是在你要编写的数据ORM层编写,我以简单起见,不规范的写在了Controller层,app/Controllers/Http/UserController.ts下编写

(1)create

点击查看代码
// demo1
import User from 'App/Models/User'
const user = new User()
user.username = 'virk'
user.email = 'virk@adonisjs.com'
await user.save()
	
	
// demo2
import User from 'App/Models/User'

const user = await User.create({
  username: 'virk',
  email: 'virk@adonisjs.com',
})

// demo3
const user = await User.createMany([
  {
    email: 'virk@adonisjs.com',
    password: 'secret',
  },
  {
    email: 'romain@adonisjs.com',
    password: 'secret',
  },
])

(2)read
点击查看代码
// demo1
const user = await User.all()
// SQL: SELECT * from "users" ORDER BY "id" DESC;
	
// demo2
const user = await User.find(1)
// SQL: SELECT * from "users" WHERE "id" = 1 LIMIT 1;

// demo3
const user = await User.findBy('email', 'virk@adonisjs.com')
// SQL: SELECT * from "users" WHERE "email" = 'virk@adonisjs.com' LIMIT 1;

// demo4
const user = await User.first()
// SQL: SELECT * from "users" LIMIT 1;

// demo5
const users = await User
  .query()
  .where('country_code', 'IN')
  .orWhereNull('country_code')

	
// demo6
const users = await User
  .query()
  .where('country_code', 'IN')
  .orWhereNull('country_code')
  .first()

(3)update
点击查看代码
// demo1
const user = await User.findOrFail(1)
user.last_login_at = DateTime.local() 
await user.save()

// demo2
await user
  .merge({ last_login_at: DateTime.local() })
  .save()

// demo3
await User
  .query()
  .where('id', 1)
  .update({ last_login_at: new Date() })

	
(4)delete
点击查看代码
// demo1
const user = await User.findOrFail(1)
await user.delete()

// demo2
await User.query().where('is_verified', false).delete()

后面再专门出一期联表查询,欢迎关注学习

二、安装并配置MySQL驱动

1、安装驱动

进入项目根目录,执行命令:
(1)npm i @adonisjs/lucid
(2)node ace configure @adonisjs/lucid
image
然后小键盘移动光标选择相应的数据库,按空格键,回车
image
然后选择文档查看方式,选择浏览器第一个就好,回车
按照文档进行配置,首先在env.ts文件下 Env.rules里面添加DB_CONNECTION: Env.schema.string(),,还有下面的这个
MYSQL_HOST: Env.schema.string({ format: 'host' }), MYSQL_PORT: Env.schema.number(), MYSQL_USER: Env.schema.string(), MYSQL_PASSWORD: Env.schema.string.optional(), MYSQL_DB_NAME: Env.schema.string(),
如下:
image

然后在config/database.ts下检查是否有如下,如果没有需补充
image

最后在项目根目录下.env文件下填写数据库连接相关的信息,如下
image

三、测试效果

start/routes.ts文件下编写一个简单接口,代码如下:

点击查看代码
import Database from '@ioc:Adonis/Lucid/Database'
import User from 'App/Models/User'
	
Route.get('/1', async () => {

  return User.all()
  // 或者使用数据库查询
  // return Database.from("users")
})
效果如下:

image

posted @ 2022-01-04 14:11  bugbob  阅读(390)  评论(0)    收藏  举报