┌───────────────────────────┐ ┌─────────────────────────────┐
│ Drizzle ORM │ │ 带数据库的 HTTP 服务器 │
└─┬─────────────────────────┘ └─────────────────────────┬───┘
│ ^ │
│-- 1. 构建查询 2. 发送构建的查询 --│ │
│ │ │
│ ┌───────────────────────────┐ │ │
└─────────────>│ │─────┘ │
│ HTTP 代理驱动 │ │
┌──────────────│ │<─────────────┬───────────┘
│ └───────────────────────────┘ │
│ 3. 执行查询 + 返回原始结果
│-- 4. 映射数据并返回
│
vDrizzle HTTP 代理
本指南假定您已熟悉:
- 使用 Drizzle 进行数据库 连接基础
HTTP 代理的工作原理以及您可能需要它的原因
Drizzle Proxy 在您需要实现自己的驱动程序与数据库的通信时使用。 它可以在几种情况下使用,例如在现有驱动程序的查询阶段添加自定义逻辑。 最常见的用法是与 HTTP 驱动程序一起使用,它将查询发送到您的数据库服务器,执行查询 并以原始数据响应,Drizzle ORM 然后可以将其映射为结果。
它在底层是如何工作的?
Drizzle ORM 还支持简单地使用异步回调函数来执行 SQL。
sql是带占位符的查询字符串。params是参数数组。- 根据 SQL 语句,
method将被设置为run、all、values或get之一。
Drizzle 总是等待返回值为 {rows: string[][]} 或 {rows: string[]}。
- 当
method为get时,您应该返回一个作为{rows: string[]}的值。 - 否则,您应该返回
{rows: string[][]}。
import { drizzle } from 'drizzle-orm/sqlite-proxy';
import axios from 'axios';
const db = drizzle(async (sql, params, method) => {
try {
const rows = await axios.post('http://localhost:3000/query', { sql, params, method });
return { rows: rows.data };
} catch (e: any) {
console.error('来自 sqlite 代理服务器的错误:', e.response.data)
return { rows: [] };
}
});批量支持
Sqlite Proxy 支持批量请求,与所有其他驱动程序的处理方式相同。请查看完整的 文档
您需要为批量查询指定特定的回调,并处理对代理服务器的请求:
import { drizzle } from 'drizzle-orm/sqlite-proxy';
import axios from 'axios';
type ResponseType = { rows: any[][] | any[] }[];
const db = drizzle(async (sql, params, method) => {
// 单次查询逻辑。和上面的代码相同
}, async (queries: { sql: string, params: any[], method: 'all' | 'run' | 'get' | 'values'}[]) => {
try {
const result: ResponseType = await axios.post('http://localhost:3000/batch', { queries });
return result;
} catch (e: any) {
console.error('来自 sqlite 代理服务器的错误:', e);
throw e;
}
});然后您可以使用 db.batch([]) 方法,这将代理所有查询。
批量响应应为原始值的数组(数组中的数组),顺序与它们发送到代理服务器时相同。
除非您打算手动编写每个 SQL 查询,否则表声明会很有帮助:
import { sql } from "drizzle-orm";
import { text, integer, sqliteTable } from "drizzle-orm/sqlite-core";
const users = sqliteTable('users', {
id: text('id'),
textModifiers: text('text_modifiers').notNull().default(sql`CURRENT_TIMESTAMP`),
intModifiers: integer('int_modifiers', { mode: 'boolean' }).notNull().default(false),
});有关列类型的更多详情,请参阅 Drizzle 中的 SQLite 列类型。