目录
better-sqlite3中的对象有两类,一个是Database类,一个是Statement类,Database对象可以实现数据库的连接和基本操作,Database.prepare()用于生成Statement对象,Statement对象是对SQL语句的封装,方便执行固定的语句。

koa2中安装better-sqlite3
cnpm i -S better-sqlite3
在脚手架根目录新建db_sqlite3.js和mySqlite3.db

db_sqlite3.js:
- const Database = require("better-sqlite3")
- const db = new Database('mySqlite3.db', { verbose: console.log })
-
- module.exports = db
users.js:
- const router = require('koa-router')()
-
- const db = require('../db_sqlite3.js')
-
- router.prefix('/users')
-
- router.get('/', function (ctx, next) {
- const stmt = db.prepare('select * from users');
- let row = stmt.all()//返回全部记录
- ctx.body = { data: row }
- })
-
- module.exports = router
注意:此时访问/users接口将会报以下错误,因为此时mySqlite3.db是一个空数据库,还没有表

在navicate中建一张users表:


此时,再次访问接口:http://localhost:3000/users


- //查询所有记录
- router.get('/', function (ctx, next) {
- const stmt = db.prepare('select * from users');
- let row = stmt.all()//返回全部记录
- ctx.body = { data: row }
- })

- router.get('/', function (ctx, next) {
- const stmt = db.prepare('select * from users');
- let row = stmt.get()//返回第一条记录
- ctx.body = { data: row }
- })
以?占位。需要严格按照顺序来传参
单条件查询:
- router.get('/', function (ctx, next) {
- const stmt = db.prepare('select * from users where username = ?');
- let row = stmt.get('李四')
- ctx.body = { data: row }
- })

多条件查询
- router.get('/', function (ctx, next) {
- const stmt = db.prepare('select * from users where username = ? and password = ?');
- let row = stmt.get('李四', "4444")
- ctx.body = { data: row }
- })

以@占位。参数放在对象里面,顺序不重要
- router.get('/', function (ctx, next) {
- const stmt = db.prepare('select * from users where username = @username and password = @password');
- let row = stmt.get({ password: "555", username: "王五" })
- ctx.body = { data: row }
- })

注意双引号一定要在外面

- //模糊查询。注意双引号一定要在外面
- router.get('/', function (ctx, next) {
- const stmt = db.prepare("select * from users where username like '%四%'");
- let row = stmt.all()
- ctx.body = { data: row }
- })
新增1条记录:

- router.get('/', function (ctx, next) {
- const stmt = db.prepare("insert into users(username,password) values (@username,@password)");
- let row = stmt.run({ username: "赵六", password: "666" })
- ctx.body = { data: row }
- })
新增多条记录:

- router.get('/', function (ctx, next) {
- const stmt = db.prepare("insert into users(username,password) values (@username,@password)");
-
- //创建批量插入过程
- const insertMany = db.transaction((users) => {
- for (const user of users) {
- stmt.run(user)
- };
- });
-
- //执行批量插入语句
- let row = insertMany([
- { username: '钱七', password: "777" },
- { username: '孙八', password: "888" },
- { username: '李九', password: "999" },
- ]);
-
- ctx.body = { data: row }
- })

- router.get('/', function (ctx, next) {
- const stmt = db.prepare("update users set username = @username, password = @password where id =@id");
- let row = stmt.run({ id: 1, username: "张三三", password: "3333" })
- ctx.body = { data: row }
- })

- router.get('/', function (ctx, next) {
- const stmt = db.prepare("delete from users where username=?");
- let row = stmt.run('李四')
- ctx.body = { data: row }
- })

- router.get('/', function (ctx, next) {
- const create_table_users =
- `create table users
- (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- username CHAR(50) NOT NULL,
- password CHAR(50)
- );`
-
- let result = db.exec(create_table_users)//执行sql命令
- ctx.body = { data: result }
- })