首页 / 资讯中心 / 文章详情

Keystone 支持 MySQL:数据库供应商配置与实战指南

Keystone 支持 MySQL:数据库供应商配置与实战指南 ★ FEATURED ARTICLE
后端【免费下载链接】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),仅供参考
阅读完成 · 觉得有帮助?
咨询建站