HOW - 浅试前端的 Typescript ORM(含 Turso SQLite)

一、TypeScript、Turso 和 Drizzle

将 TypeScript、Turso 和 Drizzle 结合使用,可以构建强类型、安全且高效的全栈应用程序。

这三者分别在不同的层面上提供支持:

  • TypeScript:提供强类型和现代 JavaScript 特性,提升代码质量和开发效率。
  • Turso :一个由 ChiselStrike 提供的现代数据库服务,适用于边缘计算和分布式系统。官网
  • Drizzle :一个强类型的 ORM,用于简化数据库操作并确保类型安全。官网

使用场景

假设你正在构建一个分布式的任务管理系统,用户可以在不同设备上离线访问和同步数据。你可以使用 TypeScript 编写应用程序逻辑,使用 Turso 作为分布式数据库,并使用 Drizzle 作为 ORM 来处理数据库操作。

实现步骤

1. 安装依赖

首先,通过 npm 安装所需的库:

bash 复制代码
npm install typescript drizzle-orm @turso/client

2. 配置 TypeScript

创建一个 tsconfig.json 文件来配置 TypeScript:

json 复制代码
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}

3. 配置 Turso 数据库

假设你已经在 Turso 创建了一个数据库,可以通过 Turso 提供的客户端来连接数据库。

创建一个 db.ts 文件来配置数据库连接:

typescript 复制代码
import { createClient } from '@turso/client';

const TURSO_URL = 'https://your-turso-instance-url';
const TURSO_TOKEN = 'your-turso-token';

export const turso = createClient(TURSO_URL, TURSO_TOKEN);

4. 使用 Drizzle 作为 ORM

db.ts 文件中,使用 Drizzle 配置 ORM:

typescript 复制代码
import { drizzle } from 'drizzle-orm';
import { turso } from './tursoClient';  // 上一步的 turso 客户端

export const db = drizzle(turso);

5. 定义模型

models 文件夹中创建 task.ts 文件来定义模型:

typescript 复制代码
import { defineModel } from 'drizzle-orm';

export const Task = defineModel({
  table: 'tasks',
  columns: {
    id: { type: 'serial', primary: true },
    title: { type: 'varchar', length: 255 },
    description: { type: 'text' },
    isCompleted: { type: 'boolean', default: false },
    createdAt: { type: 'timestamp', default: 'now()' },
  },
});

6. 执行数据库操作

在应用程序中使用 Drizzle 进行数据库操作,例如添加任务、查询任务等。

创建一个 taskService.ts 文件:

typescript 复制代码
import { db } from './db';
import { Task } from './models/task';

// 插入新任务
export async function addTask(title: string, description: string) {
  const newTask = await db.insert(Task).values({
    title,
    description,
  });
  return newTask;
}

// 查询所有任务
export async function getTasks() {
  const tasks = await db.select(Task);
  return tasks;
}

// 更新任务状态
export async function completeTask(taskId: number) {
  await db.update(Task).set({ isCompleted: true }).where(Task.columns.id.equals(taskId));
}

7. 创建迁移脚本

使用 Drizzle 的迁移功能管理数据库架构变更。在 migrations 文件夹中创建 initialMigration.ts 文件:

typescript 复制代码
import { MigrationBuilder } from 'drizzle-orm/migration';

export const up = (pgm: MigrationBuilder) => {
  pgm.createTable('tasks', {
    id: 'id',
    title: { type: 'varchar(255)', notNull: true },
    description: { type: 'text' },
    is_completed: { type: 'boolean', default: false },
    created_at: { type: 'timestamp', default: pgm.func('current_timestamp') },
  });
};

export const down = (pgm: MigrationBuilder) => {
  pgm.dropTable('tasks');
};

然后可以通过命令行工具运行迁移:

bash 复制代码
npx drizzle-orm migrate up

结论

通过将 TypeScript、Turso 和 Drizzle 结合使用,你可以构建一个具有强类型支持、现代数据库特性和简洁 ORM API 的应用程序。这种组合适用于构建高效、可靠的全栈应用,特别是在需要处理分布式数据和离线访问的场景中。

二、ORM:不必编写复杂的 SQL 查询

TypeScript ORM 和 Drizzle

TypeScript ORM 是用于与数据库交互的对象关系映射(ORM)工具,它允许开发人员以面向对象的方式操作数据库,而不必编写复杂的 SQL 查询。ORM 工具将数据库表映射到编程语言中的类,并将表记录映射到类的实例,从而简化了数据库操作。

Drizzle 是一个用于 TypeScript 的 ORM 工具,它旨在简化数据库交互,提供更好的类型安全性和开发者体验。Drizzle 支持多种数据库,包括 PostgreSQL、MySQL、SQLite 等。

Drizzle 的特点

  1. 类型安全:Drizzle 使用 TypeScript 编写,提供了强类型支持,可以在编译时捕获错误,减少运行时错误的可能性。
  2. 简洁的 API:Drizzle 提供了直观的 API,使得数据库操作更加简洁明了。
  3. 跨数据库支持:支持多种数据库,包括 PostgreSQL、MySQL、SQLite 等。
  4. 自动迁移:提供数据库迁移功能,可以方便地管理数据库架构的变更。

Drizzle 的使用示例

下面是如何在一个 TypeScript 项目中使用 Drizzle 的简单示例:

1. 安装 Drizzle

首先,通过 npm 或 yarn 安装 Drizzle:

bash 复制代码
npm install drizzle-orm drizzle-orm-pg
# or
yarn add drizzle-orm drizzle-orm-pg

2. 配置数据库连接

创建一个 db.ts 文件来配置数据库连接:

typescript 复制代码
import { createPool } from 'pg';
import { drizzle } from 'drizzle-orm-pg';

// 创建 PostgreSQL 连接池
const pool = createPool({
  host: 'localhost',
  user: 'your_user',
  password: 'your_password',
  database: 'your_database',
  port: 5432,
});

// 使用 drizzle 创建 ORM 实例
export const db = drizzle(pool);

3. 定义模型

定义一个模型来映射数据库表:

typescript 复制代码
import { defineModel } from 'drizzle-orm';

// 定义 User 模型
export const User = defineModel({
  table: 'users',
  columns: {
    id: { type: 'serial', primary: true },
    name: { type: 'varchar', length: 255 },
    email: { type: 'varchar', length: 255, unique: true },
    createdAt: { type: 'timestamp', default: 'now()' },
  },
});

4. 执行查询

使用定义的模型执行数据库操作:

typescript 复制代码
import { db } from './db';
import { User } from './models/user';

// 插入新用户
const newUser = await db.insert(User).values({
  name: 'John Doe',
  email: 'john.doe@example.com',
});

// 查询用户
const users = await db.select(User).where(User.columns.name.equals('John Doe'));

console.log(users);

5. 迁移

Drizzle 也支持数据库迁移,通过编写迁移脚本管理数据库架构变更。

迁移脚本示例:

typescript 复制代码
import { MigrationBuilder } from 'drizzle-orm/migration';

export const up = (pgm: MigrationBuilder) => {
  pgm.createTable('users', {
    id: 'id',
    name: { type: 'varchar(255)', notNull: true },
    email: { type: 'varchar(255)', unique: true, notNull: true },
    created_at: { type: 'timestamp', default: pgm.func('current_timestamp') },
  });
};

export const down = (pgm: MigrationBuilder) => {
  pgm.dropTable('users');
};

然后可以通过命令行工具运行迁移:

bash 复制代码
npx drizzle-orm migrate up

通过这些步骤,你可以使用 Drizzle 在 TypeScript 项目中简化数据库操作,并享受类型安全和简洁 API 带来的便利。

相关推荐
建投数据1 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
迷雾漫步者1 小时前
Flutter组件————FloatingActionButton
前端·flutter·dart
向前看-1 小时前
验证码机制
前端·后端
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
燃先生._.2 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺3 小时前
分布式系统架构:服务容错
数据库·架构