什么是 ORM
ORM,全称 Object-Relational Mapping,即面向对象的关系数据库映射,是一种编程技术,用于在关系数据库和面向对象编程语言之间建立映射。ORM 框架可以让开发者以面向对象的方式操作数据库,从而简化了代码的编写和维护。
Deno 简介
Deno 是一个基于 V8 引擎的 TypeScript 运行时,由 Node.js 的创始人 Ryan Dahl 开发。相比于 Node.js,Deno 具有更好的安全性和模块化,不需要使用 npm 等包管理器,可以直接从 URL 导入模块。
在 Deno 中使用 ORM 框架
在 Deno 中实现 ORM 框架可以让开发者更加方便地操作数据库。下面我们将介绍如何在 Deno 中使用一个简单的 ORM 框架。
安装依赖
在 Deno 中使用 ORM 框架需要安装以下依赖:
import { Client } from "https://deno.land/x/mysql/mod.ts"; import { camelCase } from "https://deno.land/x/case/mod.ts";
其中,mysql
模块用于操作 MySQL 数据库,case
模块用于将数据库列名转为驼峰式命名。
配置连接信息
在使用 ORM 框架前,需要配置数据库连接信息:
const client = await new Client().connect({ hostname: "127.0.0.1", username: "root", password: "password", db: "test", });
定义模型
在 ORM 框架中,一个模型对应着数据库中的一张表,可以通过定义模型来操作数据库。
// javascriptcn.com 代码示例 class Model { static table = ""; static primaryKey = "id"; static async find(id: number) { const query = `SELECT * FROM ${this.table} WHERE ${this.primaryKey} = ?`; const result = await client.execute(query, [id]); return this.fromRow(result.rows[0]); } static async all() { const query = `SELECT * FROM ${this.table}`; const result = await client.execute(query); return result.rows.map((row: any) => this.fromRow(row)); } static async create(data: Record<string, any>) { const columns = Object.keys(data); const values = Object.values(data); const placeholders = values.map(() => "?").join(","); const query = `INSERT INTO ${this.table} (${columns.join(",")}) VALUES (${placeholders})`; const result = await client.execute(query, values); return this.find(result.lastInsertId); } static async update(id: number, data: Record<string, any>) { const columns = Object.keys(data); const values = Object.values(data); const placeholders = columns.map((column) => `${column} = ?`).join(","); const query = `UPDATE ${this.table} SET ${placeholders} WHERE ${this.primaryKey} = ?`; await client.execute(query, [...values, id]); return this.find(id); } static async delete(id: number) { const query = `DELETE FROM ${this.table} WHERE ${this.primaryKey} = ?`; await client.execute(query, [id]); } static fromRow(row: any) { if (!row) { return null; } const data: Record<string, any> = {}; for (const [key, value] of Object.entries(row)) { data[camelCase(key)] = value; } return new this(data); } constructor(data: Record<string, any>) { Object.assign(this, data); } }
在上述模型中,定义了常用的增删改查方法,并通过 fromRow
方法将数据库列名转为驼峰式命名。
定义子模型
在 ORM 框架中,一个子模型对应着数据库中的一张关联表,可以通过定义子模型来操作关联表。
// javascriptcn.com 代码示例 class SubModel extends Model { static table = "sub_table"; static primaryKey = "id"; static async findByModelId(modelId: number) { const query = `SELECT * FROM ${this.table} WHERE model_id = ?`; const result = await client.execute(query, [modelId]); return result.rows.map((row: any) => this.fromRow(row)); } constructor(data: Record<string, any>) { super(data); } }
在上述子模型中,定义了根据主模型 ID 查询关联数据的方法,并通过 super
方法调用了父模型的构造函数。
使用模型
在定义好模型后,可以通过以下方式使用模型:
// javascriptcn.com 代码示例 class User extends Model { static table = "users"; static primaryKey = "id"; static async findByUsername(username: string) { const query = `SELECT * FROM ${this.table} WHERE username = ?`; const result = await client.execute(query, [username]); return this.fromRow(result.rows[0]); } async posts() { return SubModel.findByModelId(this.id); } } const user = await User.find(1); console.log(user); const newUser = await User.create({ username: "test" }); console.log(newUser); const updatedUser = await User.update(newUser.id, { username: "test2" }); console.log(updatedUser); await User.delete(newUser.id); const userByUsername = await User.findByUsername("test2"); console.log(userByUsername); const userPosts = await user.posts(); console.log(userPosts);
在上述代码中,定义了一个 User
模型,并使用了模型中的常用方法和关联方法。
总结
在 Deno 中实现 ORM 框架可以让开发者更加方便地操作数据库,本文介绍了如何在 Deno 中使用一个简单的 ORM 框架,并通过示例代码演示了如何定义模型和子模型,并使用模型中的常用方法和关联方法。希望本文对大家学习 Deno 和 ORM 框架有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/650eca7795b1f8cacd7cf3c3