┌───────────────────────────┐ ┌─────────────────────────────┐
│ Drizzle ORM │ │ HTTP Server with Database │
└─┬─────────────────────────┘ └─────────────────────────┬───┘
│ ^ │
│-- 1. Build query 2. Send built query --│ │
│ │ │
│ ┌───────────────────────────┐ │ │
└─────────────>│ │─────┘ │
│ HTTP Proxy Driver │ │
┌──────────────│ │<─────────────┬───────────┘
│ └───────────────────────────┘ │
│ 3. Execute a query + send raw results back
│-- 4. Map data and return
│
v
Drizzle HTTP 代理
本指南假定您熟悉
- Drizzle 数据库连接基础知识
HTTP 代理如何工作以及您为何可能需要它
Drizzle Proxy 用于您需要实现自己的驱动程序与数据库通信的场景。它可以在多种情况下使用,例如在现有驱动程序的查询阶段添加自定义逻辑。最常见的用途是与 HTTP 驱动程序结合使用,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
// Example of driver implementation
import { drizzle } from 'drizzle-orm/pg-proxy';
const db = drizzle(async (sql, params, method) => {
try {
const rows = await axios.post('https://:3000/query', { sql, params, method });
return { rows: rows.data };
} catch (e: any) {
console.error('Error from pg proxy server: ', e.response.data)
return { rows: [] };
}
});
// Example of server implementation
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}`);
});