当前位置: 首页 > news >正文

【NextJS】PostgreSQL 遇上 Prisma ORM

NextJS 数据库 之 遇上Prisma ORM

  • 前言
  • 一、环境要求
  • 二、概念介绍
    • 1、Prisma Schema Language(PSL) 结构描述语言
      • 1.1 概念
      • 1.2 组成
        • 1.2.1 Data Source 数据源
        • 1.2.2 Generators 生成器
        • 1.2.3 Data Model Definition 数据模型定义
          • 字段(数据)类型和约束
          • 关系(Relations)
          • 枚举(Enum)
    • 2、Prisma Client 数据交互接口
      • 2.1 概念
      • 2.2 使用示例
    • 3、Prisma Migrate 迁移与种子
      • 3.1 概念
      • 3.2 迁移流程
      • 3.3 数据库迁移(Migrate)
      • 3.3 数据种子(Seeding)
    • 4、Prisma CLI 命令行工具
      • init
      • generate
  • 三、Next.js 中应用示例
    • 1、全新项目示例
      • 1.1 项目初始化
      • 1.2 初始化Prisma ORM
      • 1.3 数据迁移
      • 1.4 播种数据(可选)
      • 1.5 模拟业务

前言

Next.js 全栈开发的时候不免要用到数据库,采用原生数据库语法可能还需要顾虑很多方面的问题(语法安全、原生语法麻烦/繁琐/复杂、更换数据库时的语法兼容等等),为了解决这类问题诞生了ORM‌(Object-Relational Mapping)数据访问方式技术及周边工具;

这里介绍一个易用又强大的ORM‌框架/工具库:Prisma ORM

官网:https://www.prisma.io/
GitHub:https://github.com/prisma/prisma

内容包含以下两个部分:

  • 重点概念

    • Prisma Schema Language (PSL).:用来描述数据库架构的语言
  • 两个主要(常用)操作库

    • Prisma Client:为 Node.js 和 TypeScript 自动生成类型安全的查询生成器
      可用于任何Node.jsTypeScript 后端应用程序(包括无服务器应用程序和微服务)。
    • Prisma Migrate:声明式数据建模和迁移系统
      主要用于生产部署、数据迁移等应用场景
    • Prisma CLI:辅助快捷的操作命令工具

延展辅助(平台服务):

  • Prisma Postgres[链接]:托管的 PostgreSQL 数据库服务
  • Prisma Accelerate[链接]:针对现有数据库的完全托管的全局连接池和缓存层,可直接从 Prisma ORM 支持查询级缓存策略。
  • Prisma Optimize[链接]:针对数据操作,基于AI进行优化分析服务
  • Prisma Studio[链接]:用于查看和编辑等操作的数据库可视化GUI工具

一、环境要求

最新环境要求可前往官方文档:https://www.prisma.io/docs/orm/reference/system-requirements

软件:

工具最低要求版本
Node.js18.8 / 20.9 / 22.11
TypeScript (可选)5.1.X
Yarn (可选)1.19.2(当使用Yarn 1时)

操作系统:

Linux:

  • OpenSSL 1.0.x、1.1.x 或 3.x
  • zlib(libz.so.1)
  • libgcc( libgcc_s.so.1)
  • C 标准库(大多数 Linux 发行版上的 glibc 或 Alpine Linux 上的 musl libc)

Windows:

  • Microsoft Visual C++ 可再发行组件 2015或必须安装更新版本

macOS:

  • macOS 10.15 或更新版本

二、概念介绍

1、Prisma Schema Language(PSL) 结构描述语言

1.1 概念

Prisma Schema Language(简称:PSL) - Prisma ORM 的核心部分
用于定义数据库模型关系、以及生成 Prisma Client 的配置文件

  • 【Prisma Schema 参数文档】:https://www.prisma.io/docs/orm/reference/prisma-schema-reference

想要将架构拆分为多个文件? Prisma ORM 5.15.0 及更高版本中的 prismaSchemaFolder 预览功能 支持多文件 Prisma Schema 。

它是一个声明式语言,通过定义 .prisma 文件来描述数据库结构关系
Prisma Client将基于(PSL)生成数据库交互代码。

1.2 组成

  • Data Source:数据库源(例如:PostgreSQL or MongoDB…)
  • Generators:数据模型生成器(例如:Prisma Client)
  • Data model definition:数据模型定义(例如,user数据表有哪些字段、分别什么数据类型等)
1.2.1 Data Source 数据源

定义数据库的连接信息,通常包括数据库的类型(例如PostgreSQL、MySQL、SQLite等)、连接URL、以及数据库的其他配置。

示例:

datasource db {provider = "postgresql" // 指定 PostgreSQL 作为数据库url      = env("DATABASE_URL") // 从环境变量 DATABASE_URL 获取连接字符串
}
1.2.2 Generators 生成器

定义生成器的配置,Prisma默认使用生成Prisma Client。
通常会在此配置生成的Prisma Client存放的位置,以及语言(TypeScript/JavaScript)。

示例:

generator client {provider = "prisma-client-js"output   = "./generated/client"
}
1.2.3 Data Model Definition 数据模型定义

定义数据库中的实体(表)。每个model对应数据库中的一个表,表的字段对应model中的属性
可以定义字段的类型默认值约束(如@id@unique等)以及关系(如@relation)。

model User {id    Int    @id @default(autoincrement())email String @uniquename  Stringposts Post[]
}model Post {id      Int    @id @default(autoincrement())title   Stringcontent String?author  User   @relation(fields: [authorId], references: [id])authorId Int
}
字段(数据)类型和约束

每个字段可以指定数据类型,支持多种类型,如IntStringBooleanDateTimeFloatDecimal等。
可以通过@default()设置默认值,@unique设置唯一约束,@id定义主键等。

  • 更多内置约束:https://www.prisma.io/docs/orm/reference/prisma-schema-reference#attributes
model Post {id        Int      @id @default(autoincrement())title     Stringpublished Boolean  @default(false)createdAt DateTime @default(now())
}
关系(Relations)

PSL支持定义实体之间的关系。常见的关系包括一对一(1:1)一对多(1:N)多对多(M:N)。通过@relation定义。

  • 更多关系说明:https://www.prisma.io/docs/orm/prisma-schema/data-model/relations
// 示例:一对多关系model User {id    Int    @id @default(autoincrement())posts Post[]
}model Post {id      Int    @id @default(autoincrement())userId  Intauthor  User   @relation(fields: [userId], references: [id])
}
枚举(Enum)

PSL还支持枚举类型,用于表示有多个固定选项的字段。

// 示例enum Role {USERADMINMODERATOR
}model User {id    Int    @id @default(autoincrement())name  Stringrole  Role
}

更多数据模型内容可以前往官方文档探索:https://www.prisma.io/docs/orm/prisma-schema/data-model

2、Prisma Client 数据交互接口

2.1 概念

Prisma ClientPrisma ORM 的主要组成部分,它是一个自动生成的数据库查询客户端,用于与数据库进行交互。
提供一种类型安全的方式来执行数据库操作,简化与数据库的连接和操作。

  • 【Prisma Client API文档】:https://www.prisma.io/docs/orm/reference/prisma-client-reference

关键特点:

  • 自动生成:根据数据库模式(schema.prisma 文件)自动生成一个类型安全的客户端库(代码)
  • 类型安全:使用 TypeScript 来生成类型定义,这意味着在开发过程中,可以获得类型推导和自动补全,数据操作无需手动编写原始SQL语法交由Prisma Client 提供的 API 使用 JavaScript/TypeScript 中的类型安全语法
  • 完善接口(API):包含CRUD、关联、分页和排序、事务操作等
  • 数据库支持PostgreSQLMySQLMariaDBSQL ServerSQLiteCockroachDBMongoDB 各类主流数据库

2.2 使用示例

  1. 定义数据库模型(schema.prisma
datasource db {provider = "postgresql"url      = env("DATABASE_URL")
}generator client {provider = "prisma-client-js"
}model User {id    Int    @id @default(autoincrement())name  Stringemail String @unique
}
  1. 模型构建
pnpx prisma generate
  1. 在代码中使用
import { PrismaClient } from '@prisma/client';const prisma = new PrismaClient();async function main() {const users = await prisma.user.findMany();console.log(users);
}main().catch(e => {throw e
}).finally(async () => {await prisma.$disconnect()
});

3、Prisma Migrate 迁移与种子

3.1 概念

Prisma MigratePrisma ORM 中用于数据库迁移的工具。
通过自动生成和执行 SQL 迁移脚本来管理数据库结构变化,同时确保数据库结构与 Prisma Schema 文件(schema.prisma)保持一致。

3.2 迁移流程

Prisma ORM 的集成数据库迁移工具-工作流程
通常的工作流程包括以下几个步骤:

  • 修改 Prisma 模式:你在 schema.prisma 文件中修改数据库模型。
  • 创建迁移文件:运行 prisma migrate devprisma migrate create 命令,自动生成迁移文件。
  • 应用迁移:通过 prisma migrate deployprisma migrate dev 将迁移应用到数据库。
  • 查看迁移历史:Prisma 会在数据库中跟踪迁移历史,确保每次迁移都按顺序应用。

3.3 数据库迁移(Migrate)

3.3 数据种子(Seeding)

4、Prisma CLI 命令行工具

  • 文档[英]
  • 支持指令[英]

init

参数默认描述
--datasource-providerpostgresql指定块provider中字段的值datasource。选项包括sqlite、postgresql、mysql、和。sqlservermongodbcockroachdb
--url定义自定义数据源 URL
--with-model在初始 Prisma 模式中添加一个简单的用户模型。自 5.14.0 版起可用
--outputnode_modules/.prisma/client指定生成的客户端的输出位置
--generator-providerprisma-client-js定义要使用的生成器提供程序
--preview-feature定义要使用的预览功能

示例:

pnpx prisma init --datasource-provider PostgreSQL

generate

参数默认描述
--no-engine生成不带附带引擎的 Prisma Client 以与Prisma Accelerate–data-proxy一起使用。与和互斥–accelerate。在 Prisma ORM 5.2.0 及更高版本中可用。
--no-hints生成 Prisma Client,但不会在终端上打印使用提示。在 Prisma ORM 5.16.0 及更高版本中可用。
--allow-no-models将生成 Prisma Client,但不生成任何模型
--watch监视schema.prisma文件并在文件更改时重新生成 Prisma Client

示例:

prisma generate

其他的后续再整理补充…

三、Next.js 中应用示例

Next.js + PostgreSQL 组合为例!

node环境:

  • node:v20.17.0
  • pnpm:9.15.3

1、全新项目示例

1.1 项目初始化

  • react:^19.0.0
  • next:15.1.4
  • pg:^8.13.1
  • @prisma/client:^6.2.1
pnpx create-next-app@latest// 安装时,将看到以下提示:
✔ What is your project named? … .
✔ Would you like to use TypeScript? … Yes
✔ Would you like to use ESLint? … Yes
✔ Would you like to use Tailwind CSS? … Yes
✔ Would you like your code inside a `src/` directory? … No
✔ Would you like to use App Router? (recommended) … Yes
✔ Would you like to use Turbopack for `next dev`? … No
✔ Would you like to customize the import alias (`@/*` by default)? … No

增加依赖包:pg@prisma/client

pnpm add pg @prisma/client

1.2 初始化Prisma ORM

// 初始化兼容PostgreSQL驱动数据库
pnpx prisma init --datasource-provider PostgreSQL// 将看到以下提示:
✔ Your Prisma schema was created at prisma/schema.prismaYou can now open it in your favorite editor.warn You already have a .gitignore file. Don't forget to add `.env` in it to not commit any private information.Next steps:
1. Set the DATABASE_URL in the .env file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started
2. Run prisma db pull to turn your database schema into a Prisma schema.
3. Run prisma generate to generate the Prisma Client. You can then start querying your database.
4. Tip: Explore how you can extend the ORM with scalable connection pooling, global caching, and real-time database events. Read: https://pris.ly/cli/beyond-ormMore information in our documentation:
https://pris.ly/d/getting-started

至此,基础环境搞定,接下来重点查看编辑两个文件:.envprisma/schema.prisma
在这里插入图片描述
.env文件中,重点设置DATABASE_URL的值,用于建立数据库连接的配置

DATABASE_URL="postgresql://[username]:[password]@[ip|domain]:[port|5432]/[database][?param1=value1&param2=value2&...]"

prisma/schema.prisma文件中,对生成器、数据模型进行配置

generator client {provider = "prisma-client-js"output   = "./client"   // 配置生成器的代码生成位置(相对schema.prisma文件所在目录)
}datasource db {provider = "postgresql"url      = env("DATABASE_URL")
}// 以下部分均为数据模型构建配置
model User {id    Int    @id @default(autoincrement())email String @uniquename  Stringposts Post[]
}model Post {id        Int     @id @default(autoincrement())title     Stringcontent   Stringpublished Booleanuser      User    @relation(fields: [userId], references: [id])userId    Int
}

完成以上配置后,开始生成Prisma客户端代码:

// 生成Prisma客户端
pnpx prisma generate// 将看到以下提示:
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma✔ Generated Prisma Client (v6.2.1) to ./prisma/client in 24msStart by importing your Prisma Client (See: https://pris.ly/d/importing-client)Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate

在这里插入图片描述

1.3 数据迁移

将数据模型推送到数据库中

// 模型推送
pnpx prisma db push// 将看到以下提示:
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "xxxx", schema "public" at "xxxx:5432"🚀  Your database is now in sync with your Prisma schema. Done in 6.22s✔ Generated Prisma Client (v6.2.1) to ./prisma/client in 28ms

1.4 播种数据(可选)

添加ts-node@types/node到开发依赖项

pnpm add -D ts-node @types/node

Ps:非TypeScript项目需要增加typescript依赖包

prisma目录下创建一个seed.ts文件,写入播种数据

// 导入 PrismaClient(注:pnpx prisma generate生成的代码)
import { PrismaClient } from './client'// 创建 PrismaClient 实例
const prisma = new PrismaClient()// 定义 main 函数
async function main() {// 使用 upsert 方法创建或更新用户const alice = await prisma.user.upsert({where: { email: 'alice@prisma.io' },update: {},create: {email: 'alice@prisma.io',name: 'Alice',posts: {create: {title: 'Check out Prisma with Next.js',content: 'https://www.prisma.io/nextjs',published: true,},},},})// 创建另一个用户const bob = await prisma.user.upsert({where: { email: 'bob@prisma.io' },update: {},create: {email: 'bob@prisma.io',name: 'Bob',posts: {create: [{title: 'Follow Prisma on Twitter',content: 'https://twitter.com/prisma',published: true,},{title: 'Follow Nexus on Twitter',content: 'https://twitter.com/nexusgql',published: true,},],},},})console.log({ alice, bob })
}// 执行 main 函数并处理错误
main().then(async () => {await prisma.$disconnect()}).catch(async (e) => {console.error(e)await prisma.$disconnect()process.exit(1)})

package.json文件中新增以下配置,告诉prisma播种文件所在位置及其他配置信息

{// ....."prisma": {"seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts"},// .....
}

将种子数据推送上数据库里

// 种子推送
pnpx prisma db seed// 将看到以下提示:
Environment variables loaded from .env
Running seed command `ts-node --compiler-options {"module":"CommonJS"} prisma/seed.ts` ...
{alice: { id: 1, email: 'alice@prisma.io', name: 'Alice' },bob: { id: 2, email: 'bob@prisma.io', name: 'Bob' }
}🌱  The seed command has been executed.

在这里插入图片描述

1.5 模拟业务

创建一个api接口GET /api/users 用于获取用户表所有数据

1、实例化 Prisma 客户端

prisma目录创建一个db.ts文件,用于实例化
在这里插入图片描述

// file:/prisma/db.tsimport {PrismaClient} from './client'const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }export const prisma = globalForPrisma.prisma || new PrismaClient()if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prismaexport default prisma

2、创建数据API接口
在这里插入图片描述

"use server";import {NextResponse} from 'next/server'
// 导入客户端实例
import prisma from "@/prisma/db"export async function GET() {// 使用findMany方法获取user表相关数据const allUsers = await prisma.user.findMany();return NextResponse.json({message: 'Hello World',data: allUsers}, {status: 200});
}

3、测试获取是否正常
在这里插入图片描述


有何不足之处欢迎评论区或者私信我

相关文章:

【NextJS】PostgreSQL 遇上 Prisma ORM

NextJS 数据库 之 遇上Prisma ORM 前言一、环境要求二、概念介绍1、Prisma Schema Language(PSL) 结构描述语言1.1 概念1.2 组成1.2.1 Data Source 数据源1.2.2 Generators 生成器1.2.3 Data Model Definition 数据模型定义字段(数据)类型和约束关系&…...

ASP.NET Core - 配置系统之配置提供程序

ASP.NET Core - 配置系统之配置提供程序 3. 配置提供程序3.1 文件配置提供程序3.1.1 JSON配置提供程序3.1.2 XML配置提供程序3.1.3 INI配置提供程序 3.2 环境变量配置提供程序3.3 命令行配置提供程序3.4 内存配置提供程序3.5 配置加载顺序 3.6 默认配置来源 3. 配置提供程序 前…...

【LeetCode: 215. 数组中的第K个最大元素 + 快速选择排序】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...

【Flink系列】10. Flink SQL

10. Flink SQL Table API和SQL是最上层的API,在Flink中这两种API被集成在一起,SQL执行的对象也是Flink中的表(Table),所以我们一般会认为它们是一体的。Flink是批流统一的处理框架,无论是批处理&#xff08…...

JavaScript网页设计案例-JavaScript实现数据脱敏的几种解决方式

数据脱敏是指对数据进行处理,使其在不改变原始数据含义的前提下,降低数据泄露的风险,保护用户隐私。 案例:JavaScript实现数据脱敏 1. 掩码脱敏 掩码脱敏是通过替换或隐藏数据中的部分字符来达到脱敏的效果。常见的掩码方式包括…...

第12篇:从入门到精通:掌握python高级函数与装饰器

第12篇:高级函数与装饰器 内容简介 本篇文章将深入探讨Python中的高级函数与装饰器。您将学习什么是高阶函数,掌握常用的高阶函数如map、filter、reduce的使用方法;理解闭包的概念及其应用;深入了解装饰器的定义与使用&#xff…...

审计文件标识作为水印打印在pdf页面边角

目录 说明 说明 将审计文件的所需要贴的编码直接作为水印贴在页面四个角落,节省辨别时间 我曾经写过一个给pdf页面四个角落加上文件名水印的python脚本,现在需要加一个图形界面进一步加强其实用性。首先通过路径浏览指定文件路径,先检测该路…...

leetcode416.分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...

使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用

首先服务器上需要安装docker已经docker-compose,如果没有,可以参考我之前写的文章进行安装。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下载并启动elk容器 先创建一个网关,让所有的容器共用此网…...

深度学习中超参数

深度学习中的超参数(hyperparameters)是决定网络结构的变量(例如隐藏层数量)和决定网络训练方式的变量(例如学习率)。超参数的选择会显著影响训练模型所需的时间,也会影响模型的性能。超参数是在训练开始之前设置的,而不是从数据中学习的参数。超参数是模…...

[JavaScript] 运算符详解

文章目录 算术运算符(Arithmetic Operators)注意事项: 比较运算符(Comparison Operators)注意事项: 逻辑运算符(Logical Operators)短路运算:逻辑运算符的返回值&#xf…...

Hooks 使用规则

Hooks 使用规则 命名规则 Hook 必须 useXxx 格式来命名。 PS:这种命名规则也很易读,简单粗暴 调用位置 Hook 或自定义 Hook ,只能在两个地方被调用 组件内部其他 Hook 内部 组件外部,或一个普通函数中,不能调用…...

Ubuntu 24.04 LTS 安装 Docker Desktop

Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版(1h速通) Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…...

智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来

文章目录 一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册:算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳 目录 《AI智能化办公&am…...

从 JIRA 数据到可视化洞察:使用 Python 创建自定义图表

引言 在项目管理和软件开发中,JIRA 是最广泛使用的工具之一,尤其是在追踪问题、任务和团队进度方面。对于开发者和团队来说,能够从 JIRA 中提取并分析数据,以便更好地理解项目状态和趋势,至关重要。虽然 JIRA 本身提供…...

【网络原理】万字详解 HTTP 协议

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. HTTP 前置知识1.1 HTTP 是什么1.2 HTPP 协议应用场景1.3 HTTP 协议工作过程 2. HTTP 协议格式2.1 fiddler…...

PHP企业IM客服系统

💬 企业IM客服系统——高效沟通,无缝连接的智慧桥梁 🚀 卓越性能,释放无限可能 在瞬息万变的商业环境中,我们深知沟通的力量。因此,基于先进的ThinkPHP5框架与高性能的Swoole扩展,我们匠心独运…...

Linux操作系统的灵魂,深度解析MMU内存管理

在计算机的奇妙世界里,我们每天使用的操作系统看似流畅自如地运行着各类程序,背后实则有着一位默默耕耘的 “幕后英雄”—— 内存管理单元(MMU)。它虽不常被大众所熟知,却掌控着计算机内存的关键命脉,是保障…...

PHP代码审计学习01

目录 两种思路 addslashes函数和magic_quotes_gpc配置: 今天来开php代码审计。 PHP无框架项目SQL注入挖掘技巧。 可以看看小迪老师的学习流程或者说是路线吧。 其中,最下面的代码审计工具推荐用下面两款,fortify,seay。 &…...

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 数据之道,路漫漫其修远兮,吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准:准确、有…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...