┌───────────────────────────┐ ┌─────────────────────────────┐
│ Drizzle ORM │ │ 带数据库的 HTTP 服务器 │
└─┬─────────────────────────┘ └─────────────────────────┬───┘
│ ^ │
│-- 1. 构建查询 2. 发送构建的查询 --│ │
│ │ │
│ ┌───────────────────────────┐ │ │
└─────────────>│ │─────┘ │
│ HTTP 代理驱动 │ │
┌──────────────│ │<─────────────┬───────────┘
│ └───────────────────────────┘ │
│ 3. 执行查询 + 返回原始结果
│-- 4. 映射数据并返回
│
v
Drizzle HTTP 代理
This guide assumes familiarity with:
- 数据库 连接基础 与 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[][]}
。
PostgreSQL
MySQL
SQLite
// 驱动程序实现示例
import { drizzle } from 'drizzle-orm/pg-proxy';
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('来自 pg 代理服务器的错误:', e.response.data)
return { rows: [] };
}
});
// 服务器实现示例
import { Client } from 'pg';
import express from 'express';
const app = express();
app.use(express.json());
const port = 3000;
const client = new Client('postgres://postgres:postgres@localhost:5432/postgres');
app.post('/query', async (req, res) => {
const { sql, params, method } = req.body;
// prevent multiple queries
const sqlBody = sql.replace(/;/g, '');
try {
const result = await client.query({
text: sqlBody,
values: params,
rowMode: method === 'all' ? 'array': undefined,
});
res.send(result.rows);
} catch (e: any) {
res.status(500).json({ error: e });
}
res.status(500).json({ error: 'Unknown method value' });
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});