knex
Knex是一个基于JavaScript的查询生成器
,它允许你运用JavaScript代码来生成和履行SQL查询句子。它供给了一种简单和直观的方式来与关系型数据库进行交互,而无需直接编写SQL句子。你能够运用Knex界说表结构、履行查询、刺进、更新和删去数据等操作。
Knex的装置和设置
knex支持多种数据库 pg sqlite3 mysql2 oracledb tedious
用什么数据库装置对应的数据库就行了
#装置knex
$ npm install knex --save
#装置你用的数据库
$ npm install pg
$ npm install pg-native
$ npm install sqlite3
$ npm install better-sqlite3
$ npm install mysql
$ npm install mysql2
$ npm install oracledb
$ npm install tedious
衔接数据库
import knex from 'knex'
const db = knex({
client: "mysql2",
connection: config.db
})
db:
user: root
password: '123456'
host: localhost
port: 3306
database: xiaoman
界说表结构
db.schema.createTable('list', (table) => {
table.increments('id') //id自增
table.integer('age') //age 整数
table.string('name') //name 字符串
table.string('hobby') //hobby 字符串
table.timestamps(true,true) //创立时刻和更新时刻
}).then(() => {
console.log('创立成功')
})
实现增修改差
import mysql2 from 'mysql2/promise'
import fs from 'node:fs'
import jsyaml from 'js-yaml'
import express from 'express'
import knex from 'knex'
const yaml = fs.readFileSync('./db.config.yaml', 'utf8')
const config = jsyaml.load(yaml)
// const sql = await mysql2.createConnection({
// ...config.db
// })
const db = knex({
client: "mysql2",
connection: config.db
})
const app = express()
app.use(express.json())
//查询接口 悉数
app.get('/', async (req, res) => {
const data = await db('list').select().orderBy('id', 'desc')
const total = await db('list').count('* as total')
res.json({
code: 200,
data,
total: total[0].total,
})
})
//单个查询 params
app.get('/user/:id', async (req, res) => {
const row = await db('list').select().where({ id: req.params.id })
res.json({
code: 200,
data: row
})
})
//新增接口
app.post('/create', async (req, res) => {
const { name, age, hobby } = req.body
const detail = await db('list').insert({ name, age, hobby })
res.send({
code: 200,
data: detail
})
})
//修改
app.post('/update', async (req, res) => {
const { name, age, hobby, id } = req.body
const info = await db('list').update({ name, age, hobby }).where({ id })
res.json({
code: 200,
data: info
})
})
//删去
app.post('/delete', async (req, res) => {
const info = await db('list').delete().where({ id: req.body.id })
res.json({
code: 200,
data: info
})
})
const port = 3000
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
业务
你能够运用业务来保证一组数据库操作的原子性,即要么悉数成功提交,要么悉数回滚
例如A给B转钱,需要两条句子,如果A句子成功了,B句子由于一些场景失败了,那这钱就丢了,所以业务便是为了处理这个问题,要么都成功,要么都回滚,保证金钱不会丢掉。
//伪代码
db.transaction(async (trx) => {
try {
await trx('list').update({money: -100}).where({ id: 1 }) //A
await trx('list').update({money: +100}).where({ id: 2 }) //B
await trx.commit() //提交业务
}
catch (err) {
await trx.rollback() //回滚业务
}
})