prisma

setup

1.安装 Prisma CLI(开发依赖)

bash 复制代码
npm install prisma --save-dev

2.安装 Prisma Client(运行时依赖)

bash 复制代码
npm install @prisma/client

3.初始化 Prisma 项目

使用 npx prisma init 命令初始化 Prisma 项目。该命令会在项目根目录下创建一个 prisma 文件夹,并生成一个 schema.prisma 文件。

默认创建是postgresql

bash 复制代码
npx prisma init

3.1指定数据库为sqlite

bash 复制代码
npx prisma init --datasource-provider sqlite

3.2把默认数据更改成sqlite

1.更改文件:schema.prisma ,内容如下:

generator client {

provider = "prisma-client-js"

url = env("DATABASE_URL")

}

datasource db {

provider = "sqlite"

}

2.更改环境文件(.env),内容如下:

DATABASE_URL="file:./dev.db"

表示在当前目录下创建dev.db文件:

4.数据配置更改

在.env文件更改相应信息

DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"

vscode 按装插件

输入:prisma,截图如下:

5.定义数据模型

bash 复制代码
model User {
  id    Int    @id @default(autoincrement())
  email String @unique
  name  String?  
}

然后执行命令:

bash 复制代码
npx prisma migrate dev --name init

6.更改或添加模型

每次修改模型后,都需要重新生成客户端代码:

npx prisma generate

7.启动数据库

npx prisma studio

录入三笔数据,效果如图下:

8.其它问题

1.prisma.config.ts中的process 提示不存在

npm install --save-dev @types/node

2.执行main.js 文件报错:

import { PrismaClient } from '@prisma/client';

^^^^^^^^^^^^

SyntaxError: Named export 'PrismaClient' not found. The requested module '@prisma/client' is a CommonJS module, which may not support all module.exports as named exports.

CommonJS modules can always be imported via the default export, for example using:

解决方法一:

import pkg from '@prisma/client';

const { PrismaClient } = pkg;

解决方法二:修改 package.json

加入:

bash 复制代码
{
  "type": "module"
}

然后就可以正常使用命名导入:

bash 复制代码
import { PrismaClient } from '@prisma/client';

export const prisma = new PrismaClient();

方法三:动态导入

bash 复制代码
const { PrismaClient } = await import('@prisma/client');
export const prisma = new PrismaClient();

3.错误信息如下:

D:\workspace\node\ormPrisma>npm run dev

> main@1.0.0 dev

> node main.js

node:internal/modules/cjs/loader:1383

const err = new Error(message);

^

Error: Cannot find module '.prisma/client/default'

Require stack:- D:\workspace\node\ormPrisma\node_modules@prisma\client\default.js

at Function._resolveFilename (node:internal/modules/cjs/loader:1383:15)

at defaultResolveImpl (node:internal/modules/cjs/loader:1025:19)

at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1030:22)

bash 复制代码
npx prisma generate

4.PrismaClientConstructorValidationError: Unknown property datasources provided to PrismaClient constructor.

Read more at https://pris.ly/d/client-constructor

at yl (D:\workspace\node\ormPrisma\node_modules@prisma\client\runtime\client.js:66:3832)

at new t (D:\workspace\node\ormPrisma\node_modules@prisma\client\runtime\client.js:70:1241)

at file:///D:/workspace/node/ormPrisma/main.js:4:16

at ModuleJob.run (node:internal/modules/esm/module_job:345:25)

at async onImport.tracePromise.proto (node:internal/modules/esm/loader:651:26)

at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)

bash 复制代码
npm install @prisma/adapter-better-sqlite3
bash 复制代码
 import { PrismaClient } from '@prisma/client'
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
//import { PrismaPg } from '@prisma/adapter-pg'
 
// 创建SQLite适配器
const adapter = new PrismaBetterSqlite3({url:'file:./dev.db'})

// 使用适配器初始化Prisma Client
const prisma = new PrismaClient({
  adapter,
  // 可选的日志配置
  log: [
    {
      emit: 'stdout',
      level: 'query'
    },
    {
      emit: 'stdout',
      level: 'info'
    },
    {
      emit: 'stdout',
      level: 'warn'
    },
    {
      emit: 'stdout',
      level: 'error'
    }
  ]
});

9.同步

直接同步结构模型到数据库,建议在开发环境使用

bash 复制代码
npx prisma db push

10.测试

bash 复制代码
import { PrismaClient } from '@prisma/client'
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
//import { PrismaPg } from '@prisma/adapter-pg'
 
// 创建SQLite适配器
const adapter = new PrismaBetterSqlite3({url:'file:./dev.db'})

// 使用适配器初始化Prisma Client
const prisma = new PrismaClient({
  adapter,
  // 可选的日志配置
  log: [
    {
      emit: 'stdout',
      level: 'query'
    },
    {
      emit: 'stdout',
      level: 'info'
    },
    {
      emit: 'stdout',
      level: 'warn'
    },
    {
      emit: 'stdout',
      level: 'error'
    }
  ]
});

//const prisma = new PrismaClient()
async function main() {
  try {
    console.log('Connecting to database...');
    // 测试基本连接
    await prisma.$connect()
    console.log('Connected successfully!');
    
     // 创建用户示例
    console.log('\n1. 创建用户...')
    const cuser = await prisma.user.create({
      data: {
        name: '张三',
        email: 'zhangsan@example.com'
      }
    })
    console.log('创建的用户:', JSON.stringify(cuser))
    // 查询用户
    const users = await prisma.user.findMany()
    console.log('Users:', users)
     console.log('用户及文章数据:', JSON.stringify(users, null, 2))
    
     //update
     console.log('\n2. 更新用户...')
     const uuser = await prisma.user.update({
      where: {
        id: 1
      },
      data: {
        name: '李四u'
      }
    })
    console.log('更新的用户:', JSON.stringify(uuser))

    //  //delete
    //  console.log('\n3. 删除用户...')
    //  const duser = await prisma.user.delete({
    //   where: {
          
    //   }
    //  })
  } catch (error) {
    console.error('Error details:')
    console.error('Message:', error.message)
    console.error('Stack:', error.stack)
    console.error('Name:', error.name)
  }
}

// 使用更详细的错误处理
main()
  .then(() => {
    console.log('Program completed successfully')
  })
  .catch((error) => {
    console.error('Unhandled error in main:', error)
  })
  .finally(async () => {
    console.log('Disconnecting...')
    await prisma.$disconnect()
  })

关系model

bash 复制代码
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?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

client 客户端操作

bash 复制代码
 // 创建文章示例
    console.log('\n2. 创建文章...')
    const post = await prisma.post.create({
      data: {
        title: 'Prisma Client 7.3 使用指南',
        content: '这是关于如何使用Prisma Client 7.3的详细指南',
        author: {
          connect: { id: user.id }
        }
      }
    })
    console.log('创建的文章:', post)
    
    // 查询数据示例
    console.log('\n3. 查询用户及其文章...')
    const usersWithPosts = await prisma.user.findMany({
      include: {
        posts: true
      }
    })
    console.log('用户及文章数据:', JSON.stringify(usersWithPosts, null, 2))
    
    // 更新数据示例
    console.log('\n4. 更新文章状态...')
    const updatedPost = await prisma.post.update({
      where: { id: post.id },
      data: { published: true }
    })
    console.log('更新后的文章:', updatedPost)
    
    // 删除数据示例
    console.log('\n5. 删除文章...')
    const deletedPost = await prisma.post.delete({
      where: { id: post.id }
    })
    console.log('已删除文章ID:', deletedPost.id)
    
    const result = await prisma.user.create({
								data:
								name: 'Nikolas',
								email: 'burk@prisma.io',
								posts: {
								create: {
								title: 'Second',
								content: '2',								
								},
});
//分页
const result = await prisma. user. findMany({
skip: 2,
take: 2,})
相关推荐
怪兽毕设3 小时前
基于SpringBoot的选课调查系统
java·vue.js·spring boot·后端·node.js·选课调查系统
心.c5 小时前
Vue3+Node.js实现文件上传分片上传和断点续传【详细教程】
前端·javascript·vue.js·算法·node.js·哈希算法
roamingcode6 小时前
我是如何 Vibe Coding,将 AI CLI 工具从 Node.js 迁移到 Rust 并成功发布的
人工智能·rust·node.js·github·claude·github copilot
Stream_Silver2 天前
【Node.js 安装报错解决方案:解决“A later version of Node.js is already installed”问题】
node.js
Anthony_2312 天前
基于 Vue3 + Node.js 的实时可视化监控系统实现
node.js
说给风听.2 天前
解决 Node.js 版本冲突:Windows 系统 nvm 安装与使用全指南
windows·node.js
森叶2 天前
Node.js 跨进程通信(IPC)深度进阶:从“杀人”的 kill 到真正的信号
node.js·编辑器·vim
虹科网络安全3 天前
艾体宝新闻 | NPM 生态系统陷入困境:自我传播恶意软件在大规模供应链攻击中感染了 187 个软件包
前端·npm·node.js
摇滚侠3 天前
PNPM 包管理工具和 NPM 包管理工具
vscode·npm·node.js·pnpm