Prisma 连接 SQL Server 数据库实战教程

Prisma 连接 SQL Server 数据库实战教程

prisma-examples 🚀 Ready-to-run Prisma example projects prisma-examples 项目地址: https://gitcode.com/gh_mirrors/pr/prisma-examples

前言

在现代应用开发中,数据库操作是不可或缺的一环。Prisma 作为一个现代化的数据库工具链,为开发者提供了类型安全的数据库访问体验。本文将详细介绍如何使用 Prisma 连接 Microsoft SQL Server 数据库,并通过实际示例展示完整的开发流程。

环境准备

技术栈介绍

  • Prisma: 下一代 ORM 工具,提供类型安全的数据库访问
  • SQL Server: 微软的关系型数据库管理系统
  • Docker: 用于快速部署 SQL Server 容器
  • Node.js: JavaScript 运行时环境

项目结构

典型的 Prisma 项目包含以下关键文件:

├── prisma/
│   ├── schema.prisma    # Prisma 数据模型定义
│   └── .env             # 数据库连接配置
├── src/
│   └── script.js        # 数据库操作脚本
└── tests/
    └── prisma.test.ts   # 数据库操作测试

详细步骤

1. 初始化项目

首先需要创建一个 Node.js 项目并安装必要的依赖:

npm init -y
npm install prisma typescript ts-node @types/node jest ts-jest @types/jest -D

2. 配置 SQL Server 容器

使用 Docker Compose 快速启动 SQL Server 实例:

version: '3'
services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2019-latest
    ports:
      - "1433:1433"
    environment:
      SA_PASSWORD: "Pr1sm4_Pr1sm4"
      ACCEPT_EULA: "Y"
    volumes:
      - sqlserver_data:/var/opt/mssql
volumes:
  sqlserver_data:

启动容器:

docker-compose up -d

3. 配置 Prisma 连接

prisma/.env 文件中配置数据库连接字符串:

DATABASE_URL="sqlserver://localhost:1433;database=prisma-demo;user=SA;password=Pr1sm4_Pr1sm4;trustServerCertificate=true;encrypt=true"

安全提示:生产环境中应避免使用 SA 账户,建议创建具有最小权限的专用数据库用户。

4. 定义数据模型

prisma/schema.prisma 中定义数据模型:

datasource db {
  provider = "sqlserver"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String?
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
}

5. 执行数据库迁移

使用 Prisma Migrate 将数据模型同步到数据库:

npx prisma migrate dev --name init

此命令会:

  1. 生成迁移文件
  2. 执行 SQL 语句创建表结构
  3. 自动生成 Prisma Client

6. 使用 Prisma Client 操作数据

基本 CRUD 操作示例
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()

async function main() {
  // 创建用户
  const user = await prisma.user.create({
    data: {
      name: '张三',
      email: 'zhangsan@example.com',
      posts: {
        create: { title: 'Hello Prisma' }
      }
    }
  })
  console.log('创建的用户:', user)

  // 查询所有用户及其文章
  const usersWithPosts = await prisma.user.findMany({
    include: { posts: true }
  })
  console.log('所有用户:', JSON.stringify(usersWithPosts, null, 2))
}

main()
  .catch(e => {
    throw e
  })
  .finally(async () => {
    await prisma.$disconnect()
  })
复杂查询示例
// 分页查询已发布的文章
const publishedPosts = await prisma.post.findMany({
  where: { published: true },
  skip: 0,
  take: 10,
  orderBy: { createdAt: 'desc' }
})

// 关联查询
const userWithPosts = await prisma.user.findUnique({
  where: { email: 'zhangsan@example.com' },
  include: {
    posts: {
      where: { title: { contains: 'Prisma' } }
    }
  }
})

7. 测试验证

使用 Jest 编写测试用例确保数据操作正确性:

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

describe('Prisma SQL Server 测试', () => {
  beforeAll(async () => {
    await prisma.$connect()
  })

  afterAll(async () => {
    await prisma.$disconnect()
  })

  test('创建用户测试', async () => {
    const user = await prisma.user.create({
      data: { email: 'test@example.com', name: '测试用户' }
    })
    
    expect(user).toHaveProperty('id')
    expect(user.email).toBe('test@example.com')
  })
})

最佳实践

  1. 连接管理

    • 使用 prisma.$connect() 显式建立连接
    • 操作完成后调用 prisma.$disconnect() 释放连接
  2. 错误处理

    try {
      await prisma.user.create({ data: { /* ... */ } })
    } catch (error) {
      if (error instanceof Prisma.PrismaClientKnownRequestError) {
        // 处理已知错误
      }
    }
    
  3. 性能优化

    • 批量操作使用 createManyupdateMany
    • 复杂查询合理使用 select 只返回必要字段

常见问题解决

  1. 连接失败

    • 检查 SQL Server 是否正常运行
    • 验证连接字符串中的端口、认证信息
    • 确保防火墙允许 1433 端口通信
  2. 迁移问题

    • 如果迁移失败,可使用 prisma migrate reset 重置数据库
    • 检查 SQL Server 版本兼容性
  3. 性能问题

    • 为常用查询字段添加索引
    • 避免 N+1 查询问题

总结

通过本文,我们系统性地学习了如何使用 Prisma 连接和操作 SQL Server 数据库。从环境搭建、数据模型定义到实际的 CRUD 操作,Prisma 提供了一套完整的解决方案。其类型安全的特性能够显著提升开发效率,减少运行时错误。

对于需要与 SQL Server 集成的 Node.js 项目,Prisma 无疑是一个值得考虑的优秀选择。它不仅简化了数据库操作,还通过强大的迁移工具和直观的查询 API 提升了开发体验。

prisma-examples 🚀 Ready-to-run Prisma example projects prisma-examples 项目地址: https://gitcode.com/gh_mirrors/pr/prisma-examples

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经薇皎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值