βββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββ
β 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
β
vDrizzle HTTP proxy
- Database connection basics with Drizzle
How an HTTP Proxy works and why you might need it
Drizzle Proxy is used when you need to implement your own driver communication with the database. It can be used in several cases, such as adding custom logic at the query stage with existing drivers. The most common use is with an HTTP driver, which sends queries to your server with the database, executes the query on your database, and responds with raw data that Drizzle ORM can then map to results
How it works under the hood?
Drizzle ORM also supports simply using asynchronous callback function for executing SQL.
sqlis a query string with placeholders.paramsis an array of parameters.- One of the following values will set for
methoddepending on the SQL statement -run,all,valuesorget.
Drizzle always waits for {rows: string[][]} or {rows: string[]} for the return value.
- When the
methodisget, you should return a value as{rows: string[]}. - Otherwise, you should return
{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('Error from sqlite proxy server: ', e.response.data)
return { rows: [] };
}
});Batch support
Sqlite Proxy supports batch requests, the same as itβs done for all other drivers. Check full docs
You will need to specify a specific callback for batch queries and handle requests to proxy server:
import { drizzle } from 'drizzle-orm/sqlite-proxy';
import axios from 'axios';
type ResponseType = { rows: any[][] | any[] }[];
const db = drizzle(async (sql, params, method) => {
// single queries logic. Same as in code above
}, 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('Error from sqlite proxy server:', e);
throw e;
}
});And then you can use db.batch([]) method, that will proxy all queries
Response from the batch should be an array of raw values (an array within an array), in the same order as they were sent to the proxy server
Unless you plan on writing every SQL query by hand, a table declaration is helpful:
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),
});For more details about column types, see the SQLite column types in Drizzle.