Files
classroomio/packages/db/src/drizzle.ts
T

89 lines
2.7 KiB
TypeScript

import 'dotenv/config';
import { SQL, sql } from 'drizzle-orm';
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres, { type Sql } from 'postgres';
// import * as schema from './schema';
const connectionString = process.env.DATABASE_URL ?? process.env.PRIVATE_DATABASE_URL ?? '';
type DatabaseClient = ReturnType<typeof drizzle>;
const globalDatabase = globalThis as typeof globalThis & {
__cioDatabaseClient?: Sql;
__cioDb?: DatabaseClient;
};
function createDatabaseClient() {
return postgres(connectionString, {
max: Number.parseInt(process.env.DATABASE_POOL_MAX ?? '10', 10) || 5,
idle_timeout: 20,
connect_timeout: 10,
max_lifetime: 60 * 30
});
}
const databaseClient = globalDatabase.__cioDatabaseClient ?? createDatabaseClient();
if (process.env.NODE_ENV !== 'production') {
globalDatabase.__cioDatabaseClient = databaseClient;
}
export const db = globalDatabase.__cioDb ?? drizzle(databaseClient);
if (process.env.NODE_ENV !== 'production') {
globalDatabase.__cioDb = db;
}
export type DbClient = typeof db;
export type TxClient = Parameters<typeof db.transaction>[0] extends (tx: infer T) => any ? T : never;
export type DbOrTxClient = DbClient | TxClient;
export * from 'drizzle-orm';
export * from './schema';
/**
* Creates a SQL expression that returns the length of a JSON array column
*
* @param column The column containing the JSON array
* @returns A SQL expression that can be used in where clauses
*/
function jsonArrayLength(column: any) {
// Create a SQL expression using Drizzle's sql template literal
const sqlExpression = sql`jsonb_array_length(${column})`;
// Return an object with utility methods for comparison operations
return {
// Check if array length equals a specific value
equals: (length: number): SQL<unknown> => {
return sql`${sqlExpression} = ${length}`;
},
// Check if array length is greater than a specific value
gt: (length: number): SQL<unknown> => {
return sql`${sqlExpression} > ${length}`;
},
// Check if array length is less than a specific value
lt: (length: number): SQL<unknown> => {
return sql`${sqlExpression} < ${length}`;
},
// Check if array length is greater than or equal to a specific value
gte: (length: number): SQL<unknown> => {
return sql`${sqlExpression} >= ${length}`;
},
// Check if array length is less than or equal to a specific value
lte: (length: number): SQL<unknown> => {
return sql`${sqlExpression} <= ${length}`;
}
};
}
const explainAnalyze = async (d: typeof db, query: any) => {
console.log(query.sql);
const debugResult = await d.execute(sql`EXPLAIN ANALYZE ${query}`);
console.debug(debugResult);
return query;
};
export { explainAnalyze, jsonArrayLength };