Keystone 支持 MySQL:数据库供应商配置与实战指南
后端【免费下载链接】keystoneThe superpowered headless CMS for Node.js — built with GraphQL and React项目地址https://gitcode.com/gh_mirrors/key/keystone点击查看免费下载本指南以 Keystone 官方博客《Keystone now supports MySQL》为骨架展开结合当前仓库中的源码、配置文档与测试代码系统讲解 MySQL 作为数据库供应商的配置方式、与 Postgres/SQLite 的关键差异、id 字段选择以及测试工具用法。读完本文你将能够为 Keystone 项目一键切换 MySQL并规避跨数据库行为差异带来的坑。引言Keystone 的三大数据库供应商Keystone 是一个基于 Node.js、以 GraphQL 与 React 构建的超强 headless CMS无头内容管理系统。Keystone 官方博客于 2022 年 6 月宣布Keystone 正式支持 MySQL至此支持的数据库类型达到三种——PostgreSQL、MySQL 与 SQLite。从源码角度看这三种数据库类型的支持在 packages/core/src/types/core.ts 中被定义为一个联合类型export type DatabaseProvider sqlite | postgresql | mysql而在配置校验层packages/core/src/schema.tsKeystone 会对db.provider做白名单校验只接受这三个值if (![postgresql, sqlite, mysql].includes(config.db.provider)) { throw new TypeError(db.provider only supports sqlite, postgresql or mysql) }在生成 Prisma schema 时packages/core/src/lib/core/prisma-schema-printer.ts 会直接将db.provider原样写入datasource块datasource mysql { provider mysql }也就是说Keystone 的数据库能力由对应的 Prisma providerpostgresql、mysql、sqlite驱动开发者只需在db配置中声明 provider即可获得整套 schema 生成、迁移与 GraphQL 查询能力。MySQL 数据库配置最简起步官方博客给出的 MySQLdb.config示例db.provider为mysql连接串指向本地 3306 端口的keystone数据库并使用uuid作为 id 字段如下export default config({ db: { provider: mysql, url: mysql://dbuser:dbpasslocalhost:3306/keystone, idField: { kind: uuid }, }, ... });这是最直观的起步写法provider声明数据库类型url给出包含用户名、密码、主机、端口与库名的标准 MySQL 连接串。idField: { kind: uuid }指定列表主键使用 UUID 字符串而非默认的自增整数。基于驱动适配器的现代配置推荐随着 Prisma 驱动适配器driver adapter机制的引入当前仓库的官方配置文档docs/content/docs/config/config.md推荐在db中使用prismaClientOptions显式传入适配器。MySQL 对应的适配器是prisma/adapter-mariadbMariaDB 协议与 MySQL 兼容可直连 MySQL 服务器import { PrismaMariaDb } from prisma/adapter-mariadb export default configTypeInfo({ db: { provider: mysql, prismaClientOptions: () ({ adapter: new PrismaMariaDb(process.env.DATABASE_URL!), }), onConnect: async context { /* ... */ }, idField: { kind: uuid }, }, /* ... */ })配置项说明provider取值固定为mysql由 DatabaseProvider 约束prismaClientOptions返回 Prisma Client 构造选项的函数其中必须包含adapteronConnect接收 KeystoneContext如数据播种等启动期动作idFieldid 字段种类可为cuid默认、uuid、nanoid、ulid或autoincrementMySQL 与 PostgreSQL 上autoincrement还可指定type: BigInt。配套地还需要在prisma.config.ts中为 Prisma CLI 提供数据源 URLkeystone dev内部的prisma db push依赖它import dotenv/config import { defineConfig, env } from prisma/config export default defineConfig({ schema: schema.prisma, migrations: { path: migrations }, datasource: { url: env(DATABASE_URL), // only necessary if you want to use a specific shadow database shadowDatabaseUrl: env(SHADOW_DATABASE_URL), }, })注意prismaClientOptions运行时的 Prisma Client与prisma.config.tsPrisma CLI是两套独立的配置来源不要混用。三种数据库的关键差异与选型依据官方博客明确指出“Postgres 与 MySQL 在运行方式上存在差异”并引导读者参考《choosing the right database》指南。仓库中的 docs/content/docs/guides/choosing-a-database.md 给出了选型时最需要关注的三个差异点1. 大小写敏感性Case SensitivityPostgres默认区分大小写使用StringFilter时可用mode: insensitive实现不区分大小写的查询MySQL默认不区分大小写SQLite对contains、startsWith、endsWith不区分大小写注意mode: insensitive在 MySQL 与 SQLite 上不被支持。这意味着同样的 GraphQL 过滤与排序查询在不同数据库上的结果可能不同取决于数据库的 collation排序规则。2. 字段默认类型差异Prisma 针对不同数据库使用不同的默认列类型。例如 Keystone 的text字段在 Prisma 中映射为StringPostgres使用text列类型MySQL使用varchar(191)列类型。如需覆盖默认类型Keystone 的text字段支持db.nativeType选项。从源码 packages/core/src/lib/core/prisma-schema-printer.ts 可以看到nativeType 会以${datasourceName}.${nativeType}的形式打印进生成的 schema例如mysql.VarChar(255)。3. 自增整数字段的要求当 Integer 字段使用defaultValue: { kind: autoincrement }时MySQL 要求该字段必须带索引即同时设置isIndexed: true或isIndexed: unique。Postgres 没有这个限制。从源码packages/core/src/fields/types/integer/index.ts、packages/core/src/fields/types/bigInt/index.ts看autoincrement还受若干约束校验例如 SQLite 不支持BigInt类型的自增 idpackages/core/src/lib/id-field.ts因此跨数据库迁移时要特别注意。id 字段从autoincrement到uuid官方博客示例特意为 MySQL 选择了idField: { kind: uuid }这与 MySQL 自增主键的行为差异直接相关。Keystone 支持五种 id 种类具体映射逻辑位于 packages/core/src/lib/id-field.tsidField kindPrisma 标量默认值cuid默认Stringcuid 生成器uuidStringuuid 生成器nanoidStringnanoid 生成器可配lengthulidStringulid 生成器autoincrementInt或type: BigInt数据库自增当kind为autoincrement时可选的type在 MySQL/PostgreSQL 上支持BigInt而 SQLite 不支持 BigInt 自增 id会在校验阶段直接抛错。因此若希望主键为随机字符串便于分布式生成、避免暴露数据量使用uuid/cuid/nanoid/ulid若希望沿用数据库自增主键使用autoincrement并注意 MySQL 下列字段的索引要求见上文。MySQL 下的测试keystone-6/core/testing/mysql仓库为 MySQL 提供了专门的测试工具入口为 packages/core/src/testing/mysql.ts。它封装了 MySQL/MariaDB 连接的常用流程resetDatabase(config, migrationsDirectory)解析连接串中的数据库名先尝试连接目标库若库不存在ER_BAD_DB_ERROR/ errno 1049会先自动创建通过mysql系统库建库使用CREATE DATABASE ... CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_cierrno 1007 表示库已存在忽略随后 DROP 并重建目标库再依次执行migrationsDirectory下的迁移 SQL完成测试库重置。升级指南docs/content/docs/guides/migrate-to-8.md指出测试工具按 provider 拆分PostgreSQL 使用keystone-6/core/testing/postgresqlMySQL 使用keystone-6/core/testing/mysql。API 测试套件tests/api-tests/utils.ts也展示了按DATABASE_URL前缀自动选择 provider 并构造对应适配器的标准做法if (dbUrl.startsWith(mysql:)) return mysql as const // ... return { adapter: new PrismaMariaDb(url) }这与你生产环境配置中的prismaClientOptions使用方式完全一致。完整实战示例将现有项目切换到 MySQL综合上述内容一个可落地的 MySQL 配置如下可直接复制到keystone.tsimport { config } from keystone-6/core import { PrismaMariaDb } from prisma/adapter-mariadb export default config({ db: { provider: mysql, url: process.env.DATABASE_URL!, prismaClientOptions: () ({ adapter: new PrismaMariaDb(process.env.DATABASE_URL!), }), onConnect: async context { // 可选启动时执行数据播种等操作 }, idField: { kind: uuid }, }, lists: { /* ... */ }, })环境变量示例DATABASE_URLDATABASE_URLmysql://dbuser:dbpasslocalhost:3306/keystone然后按以下步骤完成接入安装驱动依赖pnpm add prisma/adapter-mariadb具体以项目包管理器为准在prisma.config.ts中配置datasource.url指向DATABASE_URL运行keystone dev或keystone prisma migrate dev让 Prisma 依据 provider 生成/同步 schema启动后即可通过 GraphQL API 与 Admin UI 操作 MySQL 中的数据。结语MySQL 的加入使 Keystone 在数据库选型上拥有 Postgres、MySQL、SQLite 三档能力SQLite 适合本地开发与 Embedded Keystone 这类嵌入式场景Postgres 与 MySQL 适合生产环境。切换数据库时重点检查大小写敏感性、字段默认列类型与自增字段索引这三处行为差异配合仓库中的 数据库选型指南 与 DB 配置文档即可平稳迁移。赞分享后端【免费下载链接】keystoneThe superpowered headless CMS for Node.js — built with GraphQL and React项目地址https://gitcode.com/gh_mirrors/key/keystone点击查看免费下载相关推荐MeterSphere多数据库支持MySQL与PostgreSQL配置全指南MeterSphere多数据库支持MySQL与PostgreSQL配置全指南 引言解决企业级测试平台的数据库选型困境 你是否正面临测试平台数据库选型的两难质量保障接口测试测试后端前端AI 应用DevOpsKiCad Footprint Libraries常见问题解答解决你的封装库使用难题KiCad Footprint Libraries常见问题解答解决你的封装库使用难题 KiCad Footprint Libraries是KiCad版本5的官MuJoCo 并行仿真指南3 条路线跑通大规模批量物理模拟MuJoCo 并行仿真指南3 条路线跑通大规模批量物理模拟 MuJoCo 是一款通用的多关节接触物理仿真引擎核心是把刚体、关节与接触在离散时间步里稳定求解。物理引擎机器人机器学习图形学上一篇双速率分词革命Step-Audio-Tokenizer如何重新定义语音大模型交互下一篇告别顶面缝隙与毛边OrcaSlicer 流量校准一次搞定指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Humanizer 小数秒时间跨度人性化策略:IFractionalTimeSpanHumanizeStrategy 接口深度解析与自定义实现指南

Humanizer 小数秒时间跨度人性化策略:IFractionalTimeSpanHumanizeStrategy 接口深度解析与自定义实现指南

开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 导读 …

2026/9/24 14:40:57 阅读更多 →
shadcn-vue Dropdown Menu 组件完整指南:安装、API 与实战示例

shadcn-vue Dropdown Menu 组件完整指南:安装、API 与实战示例

UI组件前端 【免费下载链接】shadcn-vue Vue port of shadcn-ui 项目地址: https://gitcode.com/gh_mirrors/sh/shadcn-vue 点击查看 免费下载 本指南围绕 shadcn-vue 中的 Dropdown Menu(下拉菜单)组件展开,它是通过按钮等触发器…

2026/9/24 14:40:57 阅读更多 →
Miller 日志处理实战:用 DKVP 格式对异构日志做临时分析与聚合

Miller 日志处理实战:用 DKVP 格式对异构日志做临时分析与聚合

CLI数据分析 【免费下载链接】miller Miller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON 项目地址: https://gitcode.com/gh_mirrors/mi/miller 点击查看 免费下载 本文基于 Miller 官方文档《Log-processi…

2026/9/24 14:39:57 阅读更多 →

最新新闻

PHPStan `preInc.type` 错误详解:在类型不支持时使用前置自增运算符 `++`

PHPStan `preInc.type` 错误详解:在类型不支持时使用前置自增运算符 `++`

PHPStan preInc.type 错误详解:在类型不支持时使用前置自增运算符 【免费下载链接】phpstan PHP Static Analysis Tool - discover bugs in your code without running it! 项目地址: https://gitcode.com/gh_mirrors/ph/phpstan preInc.type 是 PHPStan 官…

2026/9/24 15:21:37 阅读更多 →
OpenCV G-API 背景解析:图执行模型如何同时优化与移植图像处理流水线

OpenCV G-API 背景解析:图执行模型如何同时优化与移植图像处理流水线

计算机视觉图像处理深度学习机器学习 【免费下载链接】opencv_contrib Repository for OpenCVs extra modules 项目地址: https://gitcode.com/gh_mirrors/op/opencv_contrib 点击查看 免费下载 导读 本文以 opencv_contrib 仓库中 G-API 模块的背景章节&#xff…

2026/9/24 15:21:37 阅读更多 →
Design Compiler:Concurrent Clock and Data Optimization(CCD)的使用

Design Compiler:Concurrent Clock and Data Optimization(CCD)的使用

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 目录 并行时钟与数据优化的原理 向IC Compiler II传递CCD信息 旧版行为 新版行为(默认) 并行时钟与数据优化的原理 物理实现工具&…

2026/9/24 15:21:37 阅读更多 →
n8n生产环境部署实战:Docker Compose+PostgreSQL+反向代理完整指南

n8n生产环境部署实战:Docker Compose+PostgreSQL+反向代理完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 15:21:37 阅读更多 →
PHPStan 错误标识解析:nullCoalesce.unnecessary——发现并清除冗余的 `?? null` 与 `??= null`

PHPStan 错误标识解析:nullCoalesce.unnecessary——发现并清除冗余的 `?? null` 与 `??= null`

PHPStan 错误标识解析:nullCoalesce.unnecessary——发现并清除冗余的 ?? null 与 ?? null 【免费下载链接】phpstan PHP Static Analysis Tool - discover bugs in your code without running it! 项目地址: https://gitcode.com/gh_mirrors/ph/phpstan …

2026/9/24 15:21:37 阅读更多 →
在 VoltAgent 中接入 Amazon Bedrock:从凭证配置到多模型路由的完整实战指南

在 VoltAgent 中接入 Amazon Bedrock:从凭证配置到多模型路由的完整实战指南

人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆 【免费下载链接】voltagent AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework 项目地址: https://gitcode.com/gh_mirrors/vo/voltagent 点击查看 免费下载 本…

2026/9/24 15:20:37 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →