阅读视图
🚀🚀🚀Prisma 发布无 Rust 引擎预览版,安装和使用更轻量;支持任何 ORM 连接引擎;支持自动备份...
前言
之前我已经陆陆续续介绍了两篇 Prisma
的文章,最近发布了新的预览版本,我就马上来更新这次的更新内容了~
往期精彩推荐
- 🚀🚀🚀这些高效实用的 vite 插件你一定要知道!更新弹窗、mock数据、开发快捷键、自动导入...
- 🚀🚀🚀 尤雨溪宣布 Vite 发布 Rolldown-Vite 预览版,性能超级快!⚡️⚡️⚡️
- ⚡️Vitest 3.2 发布,测试更高效;🚀Nuxt v4 测试版本发布,焕然一新;🚗Vite7 beta 版发布了
- 更多精彩文章欢迎关注我的公众号:萌萌哒草头将军
正文
Prisma
作为一款强大的 ORM
工具,近期发布了多项更新。这些更新不仅提升了开发体验,还为本地开发和数据管理带来了更多便利!
下面是详细内容!
1. Prisma ORM v6.9.0
无 Rust 引擎预览
Prisma ORM
v6.9.0
推出了无 Rust
引擎的预览版,减少了对 Rust
的依赖,这意味着安装和部署流程更加轻量,当前支持 PostgreSQL
和 SQLite
!
需要在 schema.prisma
中启用预览功能:
generator client {
provider = "prisma-client-js"
previewFeatures = ["queryCompiler", "driverAdapters"]
}
2. 通过任何 ORM 连接 Prisma Postgres
Prisma Postgres
现支持通过任何 ORM(如 Drizzle
、Kysely
、TypeORM
)使用常规 PostgreSQL
TCP 连接字符串进行连接。这大大增强了 Prisma Postgres
的灵活性,开发者可以自由选择喜欢的 ORM 工具。无服务器驱动目前仍处于早期访问阶段。
在环境变量中配置 PostgreSQL
连接字符串:
DATABASE_URL=postgres://user:password@host:port/database?schema=public
在代码中(如使用 Kysely
):
import { Kysely } from "kysely";
import { PostgresDialect } from "kysely";
import { Pool } from "pg";
const db = new Kysely({
dialect: new PostgresDialect({
pool: new Pool({
connectionString: process.env.DATABASE_URL,
}),
}),
});
开发者可以无缝将 Prisma Postgres
集成到现有项目中,无需局限于 Prisma Client
。灵活性提升明显,特别适合混合技术栈团队!
3. Prisma Postgres
自动备份与恢复
Prisma Postgres
新增了自动备份与恢复功能,通过 Prisma Console UI
提供一键操作,开发者可轻松管理数据库备份。这项功能显著提高了数据安全性,适合需要频繁备份的生产环境!
在 Prisma Console UI
中,切换到“Backups”选项卡,点击“Create Backup”生成备份,或选择现有备份进行恢复!
确保配置好环境变量:
PRISMA_POSTGRES_URL=postgres://user:password@host:port/database
自动备份功能简化了数据管理流程,减少手动操作的时间成本。恢复过程通过 UI
直观完成,适合快速回滚或灾难恢复场景。相比传统手动备份,操作效率提升约 50%
,且 UI
界面降低了误操作风险。
4. Prisma VS Code
扩展 UI 改进
Prisma
的 VS Code
扩展新增了数据库管理 UI,支持认证、实例管理、数据编辑和模式可视化。这让开发者能在 VS Code
中直接管理 Prisma Postgres
实例,提升生产力。
安装扩展后,在 VS Code
侧边栏打开 Prisma 面板,输入 Prisma Postgres
连接字符串进行认证:
DATABASE_URL=postgres://user:password@host:port/database
随后可通过 UI 创建/删除实例、编辑数据或可视化数据库模式。
新 UI 提供了一站式数据库管理体验,开发者无需切换到其他工具即可完成认证、数据编辑等操作。模式可视化功能直观展示表关系,调试效率提升约 30%
。对于频繁操作数据库的开发者,这是一个显著的生产力提升。
5. 本地 Prisma Postgres
开发增强
本地 Prisma Postgres
现支持持久化数据库和多实例运行,prisma init
默认使用本地开发环境。
运行以下命令初始化本地开发环境:
npx prisma init --datasource-provider postgres
在 schema.prisma
中配置本地数据库:
datasource db {
provider = "postgresql"
url = "postgres://localhost:5432/mydb"
}
本地开发环境支持持久化数据和多实例运行,开发者可模拟生产环境进行测试,减少云端成本。prisma init
默认本地化设置简化了配置流程,适合快速原型开发,测试效率提升约 40%
!
最后
以上是 Prisma
最新更新的详细解析!这是具体的更新日志:Prisma | Changelog
今天的分享就这些了,感谢大家的阅读,如果文章中存在错误的地方欢迎指正!
往期精彩推荐
🏖️ TanStack Router:搜索参数即状态!🚀🚀🚀
前言
之前介绍过 TanStack
,最近发现 TanStack Router
更新了一篇博客,介绍了搜索参数解析的新理念!今天分享给大家~,下面是翻译之后的原文!
往期精彩推荐
- 🚀🚀🚀这些高效实用的 vite 插件你一定要知道!更新弹窗、mock数据、开发快捷键、自动导入...
- 🚀🚀🚀 尤雨溪宣布 Vite 发布 Rolldown-Vite 预览版,性能超级快!⚡️⚡️⚡️
- ⚡️Vitest 3.2 发布,测试更高效;🚀Nuxt v4 测试版本发布,焕然一新;🚗Vite7 beta 版发布了
- 更多精彩文章欢迎关注我的公众号:萌萌哒草头将军
正文
搜索参数即状态
搜索参数历来被视为二等状态。它们是全局的、可序列化的、可共享的——但在大多数应用程序中,它们仍然通过字符串解析、松散的约定和脆弱的实用工具拼凑而成。
即使是像验证 sort
参数这样简单的事情,也很快变得冗长:
const schema = z.object({
sort: z.enum(['asc', 'desc']),
})
const raw = Object.fromEntries(new URLSearchParams(location.href))
const result = schema.safeParse(raw)
if (!result.success) {
// 回退、重定向或显示错误
}
这种方法有效,但它是手动的且重复的。没有类型推断、与路由本身没有关联,而且一旦你想添加更多类型、默认值、转换或结构,它就会崩溃。
更糟糕的是,URLSearchParams
只支持字符串。它不支持嵌套 JSON、数组(除了简单的逗号分割外)或类型强制转换。因此,除非你的状态是扁平且简单的,否则你很快就会遇到瓶颈。
这就是为什么我们开始看到工具和提案的兴起——比如 Nuqs、Next.js RFCs 和用户自定义模式——旨在使搜索参数更具类型安全性和人体工程学。这些大多专注于改进从 URL 的 读取。
但几乎没有哪一个解决了更深层次、更困难的问题:写入 搜索参数,以安全和原子化的方式,充分了解路由上下文。
写入搜索参数是问题所在
从 URL 读取是一回事。从代码中构建一个有效且有意的 URL 是另一回事。
当你尝试这样做时:
<Link to="/dashboards/overview" search={{ sort: 'asc' }} />
你会意识到你根本不知道这个路由支持哪些搜索参数,或者你是否正确地格式化了它们。即使有助手来将它们字符串化,也没有任何机制来强制调用者和路由之间的契约。没有类型推断、没有验证、没有护栏。
这就是 约束成为特性 的地方。
如果不在路由本身中明确声明搜索参数模式,你就只能猜测。你可能在一个地方进行了验证,但没有什么能阻止另一个组件使用无效、部分或冲突的状态进行导航。
约束是协调成为可能的关键。它使 非本地调用者 能够安全参与。
本地抽象有所帮助 —— 但它们无法协调
像 Nuqs 这样的工具是本地抽象如何改善搜索参数处理 人体工程学 的绝佳例子。你可以获得基于 Zod 的解析、类型推断,甚至是可写的 API——所有这些都限定在特定组件或钩子中。
它们使在 隔离 中读写搜索参数变得更容易——这很有价值。
但它们无法解决更广泛的 协调 问题。你仍然会遇到重复的模式、分散的期望,以及无法在路由或组件之间强制一致性的问题。默认值可能冲突。类型可能漂移。当路由演变时,没有什么能保证所有调用者都会随之更新。
这才是真正的碎片化问题——解决它需要将搜索参数模式引入路由层本身。
TanStack Router 如何解决这个问题
TanStack Router 提供了整体解决方案。
你无需在应用程序中分散模式逻辑,而是 在路由本身中定义它:
export const Route = createFileRoute('/dashboards/overview')({
validateSearch: z.object({
sort: z.enum(['asc', 'desc']),
filter: z.string().optional(),
}),
})
这个模式成为唯一的真相来源。你在任何地方都能获得完整的推断、验证和自动补全:
<Link
to="/dashboards/overview"
search={{ sort: 'asc' }} // 完全类型化,完全验证
/>
想只更新部分搜索状态?没问题:
navigate({
search: (prev) => ({ ...prev, page: prev.page + 1 }),
})
它是 reducer 风格的、事务性的,并直接与路由器的响应性模型集成。组件仅在它们使用的特定搜索参数发生变化时才会重新渲染——而不是每次 URL 发生变化时。
TanStack Router 如何防止模式碎片化
当你的搜索参数逻辑存在于用户空间——分散在钩子、实用工具和助手函数中——不可避免地会出现 冲突的模式。
也许一个组件期望 sort: 'asc' | 'desc'
。另一个添加了 filter
。第三个假定 sort: 'desc'
为默认值。它们之间没有共享的真相来源。
这会导致:
- 不一致的默认值
- 冲突的格式
- 设置了其他组件无法解析的值的导航
- 损坏的深度链接和无法追踪的错误
TanStack Router 通过将模式直接绑定到路由定义——以 层级方式 防止这种情况。
父路由可以定义共享的搜索参数验证。子路由继承该上下文,以类型安全的方式添加或扩展它。这使得在应用程序的不同部分意外创建重叠、不兼容的模式变得 不可能。
示例:安全的分层搜索参数验证
以下是实际操作方式:
// routes/dashboard.tsx
export const Route = createFileRoute('/dashboard')({
validateSearch: z.object({
sort: z.enum(['asc', 'desc']).default('asc'),
}),
})
然后,子路由可以安全地扩展该模式:
// routes/dashboard/$dashboardId.tsx
export const Route = createFileRoute('/dashboard/$dashboardId')({
validateSearch: z.object({
filter: z.string().optional(),
// ✅ `sort` 从父路由自动继承
}),
})
当你匹配 /dashboard/123?sort=desc&filter=active
时,父路由验证 sort
,子路由验证 filter
,一切无缝协作。
尝试在子路由中将所需的父参数重新定义为完全不同的内容?会触发类型错误。
validateSearch: z.object({
// ❌ 类型错误:布尔值无法扩展父路由的 'asc' | 'desc'
sort: z.boolean(),
filter: z.string().optional(),
})
这种强制执行使嵌套路由既可组合又安全——这是一种罕见的组合。
内置纪律
这里的魔法在于,你无需教导团队遵循约定。路由 拥有 模式。每个人只需使用它。没有重复。没有漂移。没有无声的错误。没有猜测。
当你将验证、类型化和所有权引入路由器本身时,你就不再将 URL 当作字符串,而是开始将其视为真正的状态——因为它们就是状态。
搜索参数即状态
大多数路由系统将搜索参数视为事后补充。你 可以 读取它们,也许可以解析,也许可以字符串化,但很少有你真正可以 信任 的东西。
TanStack Router
颠倒了这一观念。它使搜索参数成为路由契约的核心部分——经过验证、可推断、可写且具有响应性。
因为如果你不将搜索参数视为状态,你就会不断泄露它、破坏它并绕过它。
最好从一开始就正确对待它。
如果你对将搜索参数作为一等状态的可能性感到好奇,我们邀请你尝试 TanStack Router。体验在路由逻辑中验证、可推断和响应性搜索参数的力量。
最后
搜索参数很可能导致类型安全和协调等问题。TanStack Router 提供了一种解决方案,将搜索参数模式整合到路由定义中,实现验证、推断和响应性,从而防止模式碎片化并确保安全的分层验证!
原文链接:tanstack.com/blog/search…