Become a Gold Sponsor

Drizzle HTTP 代理

This guide assumes familiarity with:

HTTP 代理的工作原理以及您可能需要它的原因

Drizzle Proxy 在您需要实现自己的驱动程序与数据库的通信时使用。 它可以在几种情况下使用,例如在现有驱动程序的查询阶段添加自定义逻辑。 最常见的用法是与 HTTP 驱动程序一起使用,它将查询发送到您的数据库服务器,执行查询 并以原始数据响应,Drizzle ORM 然后可以将其映射为结果。

它是如何在底层工作的?

┌───────────────────────────┐                 ┌─────────────────────────────┐              
│       Drizzle ORM         │                 │  带数据库的 HTTP 服务器    │             
└─┬─────────────────────────┘                 └─────────────────────────┬───┘             
  │                                                ^                    │
  │-- 1. 构建查询         2. 发送构建的查询 --│                    │
  │                                                │                    │
  │              ┌───────────────────────────┐     │                    │
  └─────────────>│                           │─────┘                    │ 
                 │      HTTP 代理驱动        │                          │
  ┌──────────────│                           │<─────────────┬───────────┘
  │              └───────────────────────────┘              │
  │                                                  3. 执行查询 + 返回原始结果
  │-- 4. 映射数据并返回        

  v

Drizzle ORM 还支持简单地使用异步回调函数来执行 SQL。

Drizzle 总是等待返回值为 {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;

	// 防止多次查询
	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: '未知的方法值' });
});

app.listen(port, () => {
	console.log(`示例应用监听在端口 ${port}`);
});