【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',
},
])
点击查看代码
// 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()
点击查看代码
// 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() })
点击查看代码
// 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

然后小键盘移动光标选择相应的数据库,按空格键,回车

然后选择文档查看方式,选择浏览器第一个就好,回车
按照文档进行配置,首先在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(),
如下:

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

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

三、测试效果
在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")
})


浙公网安备 33010602011771号