Prisma 连接 SQL Server 数据库实战教程
前言
在现代应用开发中,数据库操作是不可或缺的一环。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
此命令会:
- 生成迁移文件
- 执行 SQL 语句创建表结构
- 自动生成 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')
})
})
最佳实践
-
连接管理:
- 使用
prisma.$connect()
显式建立连接 - 操作完成后调用
prisma.$disconnect()
释放连接
- 使用
-
错误处理:
try { await prisma.user.create({ data: { /* ... */ } }) } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { // 处理已知错误 } }
-
性能优化:
- 批量操作使用
createMany
、updateMany
- 复杂查询合理使用
select
只返回必要字段
- 批量操作使用
常见问题解决
-
连接失败:
- 检查 SQL Server 是否正常运行
- 验证连接字符串中的端口、认证信息
- 确保防火墙允许 1433 端口通信
-
迁移问题:
- 如果迁移失败,可使用
prisma migrate reset
重置数据库 - 检查 SQL Server 版本兼容性
- 如果迁移失败,可使用
-
性能问题:
- 为常用查询字段添加索引
- 避免 N+1 查询问题
总结
通过本文,我们系统性地学习了如何使用 Prisma 连接和操作 SQL Server 数据库。从环境搭建、数据模型定义到实际的 CRUD 操作,Prisma 提供了一套完整的解决方案。其类型安全的特性能够显著提升开发效率,减少运行时错误。
对于需要与 SQL Server 集成的 Node.js 项目,Prisma 无疑是一个值得考虑的优秀选择。它不仅简化了数据库操作,还通过强大的迁移工具和直观的查询 API 提升了开发体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考