有关于denodb

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;
  },
};