Prisma与多项目共享数据库的管理实践

Prisma 是一个功能强大的 ORM 工具,能够显著简化数据库操作。在开发中,多个项目共用同一个数据库是常见的场景。如果没有良好的配置和管理,可能会导致迁移冲突或数据不一致的问题。本文将深入探讨如何使用 Prisma 管理多项目共享数据库的实践,并补充一些基础使用内容,适配 MySQL 数据库。同时,本文还介绍如何使用 Prisma 连接多个数据库。


Prisma 基础使用指南

初始化 Prisma 项目
  1. 安装 Prisma 相关依赖:

    npm install prisma --save-dev
    npm install @prisma/client
    
  2. 初始化 Prisma:

    npx prisma init
    

    此操作将生成 prisma/schema.prisma 文件和 .env 文件。

  3. 编辑 .env 文件,设置 DATABASE_URL 指向你的 MySQL 数据库:

    DATABASE_URL="mysql://user:password@localhost:3306/mydatabase"
    
  4. prisma/schema.prisma 中定义你的数据模型。例如:

    datasource db {
      provider = "mysql"
      url      = env("DATABASE_URL")
    }
    
    generator client {
      provider = "prisma-client-js"
    }
    
    model User {
      id    Int     @id @default(autoincrement())
      name  String
      email String  @unique
    }
    
  5. 创建迁移并生成 Prisma Client:

    npx prisma migrate dev --name init //init log 信息
    npx prisma generate
    

通过以上步骤,Prisma 将完成初始化并生成类型安全的数据库操作客户端。

基础查询示例

使用生成的 Prisma Client 可以轻松执行数据库操作:

const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();

async function main() {
  // 创建用户
  const newUser = await prisma.user.create({
    data: {
      name: "Alice",
      email: "alice@example.com",
    },
  });
  console.log("Created user:", newUser);

  // 查询用户
  const users = await prisma.user.findMany();
  console.log("All users:", users);
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(() => {
    prisma.$disconnect();
  });

多项目共享数据库的管理实践

主项目的配置

在主项目中,完成以下初始化操作:

  1. 配置 prisma/schema.prisma 文件:

    datasource db {
      provider = "mysql"
      url      = env("DATABASE_URL")
    }
    
    generator client {
      provider = "prisma-client-js"
    }
    
    model User {
      id    Int     @id @default(autoincrement())
      name  String
      email String  @unique
    }
    
  2. 设置环境变量 DATABASE_URL,指向数据库:

    DATABASE_URL="mysql://user:password@localhost:3306/mydatabase"
    
  3. 执行以下命令:

    npx prisma migrate dev --name init
    npx prisma generate
    

    结果

    • 创建 prisma/migrations 文件夹,记录迁移历史。
    • 更新数据库结构。
    • 生成 Prisma Client。

主项目负责管理数据库迁移历史,其迁移文件可被其他项目共享。

其他项目的配置

在其他项目中,共享主项目的数据库时,需注意以下步骤:

步骤 1. 确保数据库状态同步

由于数据库结构由主项目维护,其他项目需要拉取最新的数据库状态:

npx prisma db pull

此命令会根据数据库当前状态生成 prisma/schema.prisma 文件,确保结构一致。

步骤 2. 生成 Prisma Client

在同步模式后,生成对应的 Prisma Client:

npx prisma generate
步骤 3. 使用 Prisma Client

示例代码:

const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();

async function fetchUsers() {
  const users = await prisma.user.findMany();
  console.log(users);
}

fetchUsers();
迁移管理的最佳实践
  1. 集中管理迁移

    • 将所有迁移操作集中在主项目中。
    • 通过版本控制工具共享迁移历史。
  2. 避免迁移冲突

    • 其他项目禁止创建迁移,只允许拉取数据库状态。
  3. 共享迁移文件

    • 将主项目的 prisma/migrations 文件夹复制到其他项目中。
  4. 规范迁移命名

    • 使用清晰的命名,如 add-users-table,便于追踪。

使用 Prisma 连接多个数据库

在实际项目中,可能需要连接多个数据库。以下是如何使用 Prisma 配置多个数据库的指南。

配置示例
  1. prisma/schema.prisma 中定义多个数据源:

    datasource db1 {
      provider = "mysql"
      url      = env("DATABASE_URL_1")
    }
    
    datasource db2 {
      provider = "mysql"
      url      = env("DATABASE_URL_2")
    }
    
    generator client {
      provider = "prisma-client-js"
    }
    
    model User {
      id    Int     @id @default(autoincrement())
      name  String
      email String  @unique
    }
    
    model Order {
      id         Int    @id @default(autoincrement())
      userId     Int
      product    String
      createdAt  DateTime @default(now())
    }
    
  2. .env 文件中定义多数据库连接的 URL:

    DATABASE_URL_1="mysql://user1:password1@localhost:3306/database1"
    DATABASE_URL_2="mysql://user2:password2@localhost:3306/database2"
    
使用生成的 Prisma Client
const { PrismaClient } = require("@prisma/client");

const prismaDb1 = new PrismaClient({
  datasources: { db: { url: process.env.DATABASE_URL_1 } },
});

const prismaDb2 = new PrismaClient({
  datasources: { db: { url: process.env.DATABASE_URL_2 } },
});

async function main() {
  // 使用第一个数据库
  const user = await prismaDb1.user.create({
    data: { name: "John", email: "john@example.com" },
  });
  console.log("Created user in DB1:", user);

  // 使用第二个数据库
  const order = await prismaDb2.order.create({
    data: { userId: user.id, product: "Laptop" },
  });
  console.log("Created order in DB2:", order);
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(() => {
    prismaDb1.$disconnect();
    prismaDb2.$disconnect();
  });

总结

使用 Prisma 管理多项目共享数据库或连接多个数据库是高效且灵活的解决方案。通过集中管理迁移、拉取数据库状态以及生成类型安全的客户端,开发人员可以更好地维护项目的可扩展性和稳定性。通过上述实践,你可以在复杂的数据库场景中充分利用 Prisma 的强大功能,为项目开发提速。