当然, 我很乐意帮您将 Turso 数据库更换为 PostgreSQL。这将需要一些代码修改, 主要是在数据库连接和 ORM 层面。我们将继续使用 Drizzle ORM, 因为它也支持 PostgreSQL。

以下是更新后的主要文件和代码:

  1. 首先, 安装必要的依赖:
bun add pg drizzle-orm postgres
bun add -d drizzle-kit @types/pg
  1. 更新数据库 schema。修改 src/db/schema.ts:
import { pgTable, serial, text, timestamp, integer } from 'drizzle-orm/pg-core';
 
export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  username: text('username').notNull(),
  email: text('email').notNull(),
  password: text('password').notNull(),
  createdAt: timestamp('created_at').defaultNow().notNull()
});
 
export const posts = pgTable('posts', {
  id: serial('id').primaryKey(),
  title: text('title').notNull(),
  content: text('content').notNull(),
  authorId: integer('author_id').references(() => users.id),
  createdAt: timestamp('created_at').defaultNow().notNull()
});
 
export const comments = pgTable('comments', {
  id: serial('id').primaryKey(),
  postId: integer('post_id').references(() => posts.id),
  authorId: integer('author_id').references(() => users.id),
  content: text('content').notNull(),
  createdAt: timestamp('created_at').defaultNow().notNull()
});
  1. 更新数据库连接配置。创建或修改 src/db/index.ts:
import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
import * as schema from './schema';
 
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});
 
export const db = drizzle(pool, { schema });
  1. 更新迁移脚本。修改 src/db/migrate.ts:
import { migrate } from 'drizzle-orm/node-postgres/migrator';
import { db } from './index';
 
async function main() {
  console.log('Running migrations');
 
  await migrate(db, { migrationsFolder: './drizzle' });
 
  console.log('Migrations complete');
 
  process.exit(0);
}
 
main().catch((err) => {
  console.error('Migration failed');
  console.error(err);
  process.exit(1);
});
  1. 更新 package.json 中的迁移脚本:
"scripts": {
  ...
  "generate": "drizzle-kit generate:pg",
  "migrate": "bun run src/db/migrate.ts"
}
  1. 更新 API 处理程序。修改 src/api/posts.ts:
import { db } from '../db';
import { posts, users, comments } from '../db/schema';
import { eq, desc } from 'drizzle-orm';
 
export async function getPosts() {
  return await db.select().from(posts).all();
}
 
export async function getPost(id: number) {
  return await db.select().from(posts).where(eq(posts.id, id)).get();
}
 
export async function createPost(title: string, content: string, authorId: number) {
  return await db.insert(posts).values({ title, content, authorId }).returning().get();
}
 
export async function updatePost(id: number, title: string, content: string) {
  return await db.update(posts).set({ title, content }).where(eq(posts.id, id)).returning().get();
}
 
export async function deletePost(id: number) {
  return await db.delete(posts).where(eq(posts.id, id)).returning().get();
}
 
export async function getPostComments(postId: number) {
  return await db.select().from(comments).where(eq(comments.postId, postId)).all();
}
 
export async function addComment(postId: number, authorId: number, content: string) {
  return await db.insert(comments).values({ postId, authorId, content }).returning().get();
}
  1. 确保在你的环境变量中设置了正确的 PostgreSQL 连接 URL:
DATABASE_URL=postgres://username:password@localhost:5432/your_database_name

这些修改将把你的博客系统从 Turso 迁移到 PostgreSQL。主要的变化在于数据库连接的设置和一些特定于 PostgreSQL 的语法。Drizzle ORM 的大部分查询 API 保持不变, 这使得迁移相对简单。

记得运行新的迁移命令来创建 PostgreSQL 数据库架构:

bun run generate
bun run migrate

这将生成新的迁移文件并应用它们到你的 PostgreSQL 数据库。

最后,请确保更新任何可能直接使用数据库连接的地方 (如果有的话), 以使用新的 PostgreSQL 连接。

这个迁移保留了之前的大部分功能, 只是改变了底层数据库。你的 API 端点和前端代码应该不需要太多改动, 除非它们直接依赖于 Turso 特定的功能。