oak 的todo能不能加个denodb的库的教程 。看的头皮发麻
有资源吧。
export const DATABASE: string = "deno";
export const TABLE = {
TODO: "todo",
};
import { Client } from "https://deno.land/x/mysql/mod.ts";
// 加载配置文件里的配置
import { DATABASE, TABLE } from "./config.ts";
const client = await new Client();
// Client 内置一个 connect 方法,用来供我们设置 hostname、username、password 和 db 等字段的值,以设置与 MySQL 的连接配置
// 还有一个client.query 方法,我们可以直接从 Deno 代码上运行 MySQL 查询
client.connect({
hostname: "127.0.0.1",
username: "root",
password: "", // 目前的 Deno MySQL 模块无法连接有密码的用户。不设置密码,设置里的清空用户密码
db: "", //在脚本中手动选择它
});
// 创建相关的数据库和表
const run = async () => {
// 创建一个数据库 (前提是之前没有创建过)
await client.execute(CREATE DATABASE IF NOT EXISTS ${DATABASE});
// 选择我们的数据库
await client.execute(USE ${DATABASE});
// 如果已经创建过名为 Todo 的数据表,将其删除
await client.execute(DROP TABLE IF EXISTS ${TABLE.TODO});
// 创建 Todo 数据表
await client.execute(CREATE TABLE ${TABLE.TODO} (
id int(11) NOT NULL AUTO_INCREMENT,
todo varchar(100) NOT NULL,
isCompleted boolean NOT NULL default false,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;);
};
run();
export default client;
import client from "../db/client.ts";
// 加载配置文件
import { TABLE } from "../db/config.ts";
// 加载接口文件
import Todo from "../interfaces/Todo.ts";
export default {
/**
* 通过解构的 id 参数值,来检查相应的 todo 元素是否存在于数据表中
* @param id
* @returns 返回布尔值来代表是否存在
*/
doesExistById: async ({ id }: Todo) => {
const [result] = await client.query(
`SELECT COUNT(*) count FROM ${TABLE.TODO} WHERE id = ? LIMIT 1`,
[id],
);
// 通过 count 值来检查指定 todo 是否存在。如果其值大于 0 返回 true,否则返回 false
return result.count > 0;
},
/**
* 将会返回 todo 表中的所有内容
* @returns 返回全部都是 todo 元素的数组
*/
getAll: async () => {
return await client.query(`SELECT * FROM ${TABLE.TODO}`);
},
/**
* 通过解构的 id 参数值,来返回相应的 todo 元素
* @param id
* @returns 返回一个 todo 元素
*/
getById: async ({ id }: Todo) => {
// 函数通过指定的 id 返回相应的数据
return await client.query(
`SELECT * FROM ${TABLE.TODO} WHERE id = ?`,
[id],
);
},
/**
* 在 todo 表中增加一个新的 todo 元素
* @param todo
* @param isCompleted
*/
add: async (
{ todo, isCompleted }: Todo,
) => {
// 其中的两个问号意味着这里需要使用到变量的值
return await client.query(
`INSERT INTO ${TABLE.TODO}(todo, isCompleted) values(?, ?)`,
// 是上一部分需要使用的变量,其值将会替代 (?, ?)
[
todo,
isCompleted,
],
);
},
/**
* 修改某个 todo 元素的内容
* @param id
* @param todo
* @param isCompleted
* @returns 返回一个数字 (代表影响的行数)
*/
updateById: async ({ id, todo, isCompleted }: Todo) => {
const result = await client.query(
`UPDATE ${TABLE.TODO} SET todo=?, isCompleted=? WHERE id=?`,
[
todo,
isCompleted,
id,
],
);
// 返回此条 MySQL 语句执行后影响到的数据表行数:0或1
return result.affectedRows;
},
/**
* 通过 ID 来删除指定的元素
* @param id
* @returns integer (count of effect rows)
*/
deleteById: async ({ id }: Todo) => {
const result = await client.query(
`DELETE FROM ${TABLE.TODO} WHERE id = ?`,
[id],
);
// 返回受到影响的行数。影响的行数的值依然只能是 0 或者 1,因为这个 ID 最多只会对应一个元素
return result.affectedRows;
},
};