初始化:连锁餐饮数字化运营管理平台
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
import pg from 'pg'
|
||||
|
||||
const { Pool } = pg
|
||||
|
||||
const pool = new Pool({
|
||||
host: process.env.DB_HOST || 'localhost',
|
||||
port: parseInt(process.env.DB_PORT || '5432'),
|
||||
database: process.env.DB_NAME || 'bill_query',
|
||||
user: process.env.DB_USER || 'freedak',
|
||||
password: process.env.DB_PASSWORD || '',
|
||||
max: parseInt(process.env.DB_POOL_MAX || '10'),
|
||||
})
|
||||
|
||||
pool.on('error', (err) => {
|
||||
console.error('Unexpected error on idle client', err)
|
||||
})
|
||||
|
||||
export interface QueryResult<T = any> {
|
||||
rows: T[]
|
||||
rowCount: number | null
|
||||
}
|
||||
|
||||
export async function query<T = any>(text: string, params?: any[]): Promise<QueryResult<T>> {
|
||||
const start = Date.now()
|
||||
const res = await pool.query(text, params)
|
||||
const duration = Date.now() - start
|
||||
if (duration > 500) {
|
||||
console.warn(`Slow query (${duration}ms):`, text.substring(0, 100))
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
export async function withTransaction<T>(callback: (client: pg.PoolClient) => Promise<T>): Promise<T> {
|
||||
const client = await pool.connect()
|
||||
try {
|
||||
await client.query('BEGIN')
|
||||
const result = await callback(client)
|
||||
await client.query('COMMIT')
|
||||
return result
|
||||
} catch (err) {
|
||||
await client.query('ROLLBACK')
|
||||
throw err
|
||||
} finally {
|
||||
client.release()
|
||||
}
|
||||
}
|
||||
|
||||
export default pool
|
||||
Reference in New Issue
Block a user