码桶

发现社区成员的开源项目

早晚圈 / meeting 公开
main
meeting/src/db/index.ts
index.ts1.4 KB
import { drizzle as drizzleD1 } from 'drizzle-orm/d1';
import { drizzle as drizzlePg } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
import * as schema from './schema';

export function getDb(env?: { DB?: D1Database }) {
  if (env && env.DB) {
    return {
      type: 'd1' as const,
      db: drizzleD1(env.DB, { schema: { meetings: schema.meetingsD1 } }),
      table: schema.meetingsD1,
    };
  }

  // VPS PostgreSQL 17 模式 (使用纯 JS 异步连接池库 postgres)
  const connectionString = process.env.DATABASE_URL || 'postgres://postgres:postgres@localhost:5432/meeting_forward';
  const client = postgres(connectionString);
  
  return {
    type: 'pg' as const,
    db: drizzlePg(client, { schema: { meetings: schema.meetingsPg } }),
    table: schema.meetingsPg,
  };
}

// 自动初始化 PG 表结构
export async function initPgTables() {
  const connectionString = process.env.DATABASE_URL || 'postgres://postgres:postgres@localhost:5432/meeting_forward';
  const sql = postgres(connectionString);
  
  await sql`
    CREATE TABLE IF NOT EXISTS meetings (
      id TEXT PRIMARY KEY,
      slug TEXT NOT NULL UNIQUE,
      meeting_id TEXT,
      dm_code TEXT,
      dedup_hash TEXT NOT NULL UNIQUE,
      topic TEXT,
      raw_text TEXT NOT NULL,
      user_session_id TEXT NOT NULL,
      created_at TIMESTAMP NOT NULL,
      expires_at TIMESTAMP NOT NULL
    );
  `;
  await sql.end();
}