跳转到内容
首页
Docs/数据库

数据库

PocketCode 内置一个真正的 PostgreSQL 18.2,直接在 64 位 ARM 手机的应用内运行,无需服务器,也无需注册账号。围绕它的有:编辑器中带 AI 助手的 SQL 控制台、可编辑的数据查看器、备份与恢复、执行计划、ER 图和结构设计器。同一个模块还能打开你的 PostgreSQL 和 MySQL 服务器,以及 Neon、Supabase、PlanetScale、Turso 和 Cloudflare D1 数据库。MongoDB、Redis、Firestore、监控、安全、仪表板、导入和分享位于「数据库工具」。

是什么以及如何打开

Database 是一个覆盖在应用之上的全屏管理器,不属于翻页器的五个页面之一。它有自己的返回栈:核心模块的屏幕在本页介绍,其余屏幕在「数据库工具」中。

四种打开方式

入口方法
工具面板点击底部栏的 工具,再点 开发工具 中的 数据库 磁贴。你会进入起始屏幕。
命令面板运行 数据库管理器(「连接并查询你的数据库」)。
主页数据库 快捷操作,或数据库小组件。
Backend Manager在已连接服务商的项目上点击 在 Database 中打开,会直接打开该项目、表或 SQL 控制台。

起始屏幕

模块导航的根屏幕。

你可以

  • 我的连接 打开连接列表。
  • 本地数据库 卡片显示 Running 或 Stopped。点击它即可安装引擎(仅首次,带进度条)、启动引擎并打开其中的表。
  • 应用检查过引擎后,卡片上会出现 启动 / 停止;管理(引擎屏幕)和 在项目中使用(连接 URL)只在引擎运行时出现。
  • 监控 和 架构设计器(无需连接)。

你不能做的,以及原因

  • 如果手机的架构没有对应的引擎构建,点击卡片不会安装任何东西,只提示「此版本未为你的设备包含 PostgreSQL。」模块的其余功能仍可使用。设备
  • 引擎停止时没有 管理 和 在项目中使用:此时没有可显示的内容。有意为之
Database Manager start screen on a tablet: My Connections, the Local Database card stopped with only Start, Monitoring and Schema Designer
平板上的起始屏幕。引擎停止时只有「启动」,运行后才会出现「管理」和「在项目中使用」

如何导航

  • 返回 就是 Android 的返回手势。它会一屏一屏地沿原路退回,在起始屏幕上则关闭模块。标题栏中没有返回箭头。
  • 标题是一个切换开关。 点击它(旁边的 ▾)打开 切换数据库:本地引擎会显示其数据库、新建数据库 和 引擎;其他连接只显示当前数据库。下方是 连接(当前连接排在最前,标记为 当前)和 所有连接。起始屏幕、连接列表和表单、项目列表以及结构设计器中不提供它。
  • 网格图标 打开 工具:六个分区中的 25 个工具(浏览、查询、设计、数据、服务器、安全)、一个 搜索工具 搜索框,以及一行 常用,它在你使用某个工具三次后出现(最多四个)。只显示适用于当前连接的内容。
  • 副标题 显示当前打开的是哪个数据库以及引擎是否在运行,例如 postgres · ● Engine running。
  • 生物识别锁(如果你在 安全 中开启了它)会在模块打开时要求指纹、面部或设备 PIN / 图案。
Database Manager start screen with My Connections, the Local Database card running, Monitoring and Schema Designer
起始屏幕 — 连接、本地引擎和两个快捷入口
Tools sheet with Frequent, Explore and Query sections
工具 — 一个面板,按你要做的事分组
Switch database sheet with the postgres database, New Database, Engine and the list of connections
点击标题切换数据库或连接

手机、横屏和平板

手机竖屏一次显示一个屏幕。控制台在 编辑器 和 结果 之间切换。
手机横屏左侧的一条窄栏取代了标题栏(工具和连接切换)。控制台并排显示编辑器和结果,中间有可拖动的分隔线。
平板竖屏编辑器在上,结果在下,提供 30 / 50 / 70 % 预设。侧边面板以抽屉形式打开。
平板横屏一条可折叠成窄条的常驻工具栏、一个显示连接和表的侧边面板(宽度达到 952 dp 时固定显示)、网格旁的行详情面板、一排标签页,以及控制台中的键盘快捷键。

屏幕地图

本页涵盖的模块中,每个屏幕、面板和标签页各占一行。

屏幕如何到达你可以做什么
数据库管理器(起始屏幕)工具 → 数据库、命令面板、主页或 在 Database 中打开打开 我的连接,启动或停止本地引擎,管理 它,在项目中使用,打开 监控 或 架构设计器。
数据库(连接列表)我的连接,或标题切换中的 所有连接查看收藏、本地、云端和自定义连接;打开、编辑、复制、测试、收藏或删除某个连接;用 + 添加服务器。
新建连接 / 编辑连接+、卡片上的 ⋮,或 Supabase 项目上的 使用直接连接解析连接字符串、填写详情、设置 TLS 和 SSH 隧道、测试连接、保存。
表点击某个连接,或 工具 → 表搜索表和视图,打开数据或结构,创建表,导入,导出。
数据(查看器)点击某张表或视图筛选、排序、列、视图、编辑单元格、选择行、复制为、导出、插入行、添加列。
行详情点击某一行以表单形式查看和编辑一行,复制 JSON。
表详情⋮ → 表详情,或表上的 结构列、索引、键、触发器和 DDL;重命名、清空、删除表。
创建表创建表,或 工具 → 新建表用 15 种列类型以及 PK、AI、NN、UQ 标志定义一张表。
SQL 控制台工具 → SQL 控制台编写并运行 SQL,询问 AI,使用参数和标签页,复制或导出结果,解释。
执行计划工具 → 执行计划,或 解释以树形查看计划,用 真实执行分析 实测,获取索引建议和 AI 解释。
架构树工具 → 结构树浏览 数据库 → 表 → 列和索引。
ER 图工具 → ER 图捏合缩放并拖动表与关系图,用 导出图表 导出为 PNG,作为设计编辑。
架构差异工具 → 对比结构(Pro)保存快照、运行差异比较、生成迁移。
备份与恢复工具 → 备份备份、恢复、导入和导出本地 PostgreSQL 的转储;计划备份(Pro)。
引擎管理、标题切换中的 引擎,或 工具 → 引擎设置、扩展、服务器日志本地 PostgreSQL 的 健康、扩展、日志 和 设置。
架构设计器 和新建结构向导起始屏幕,或 工具 → 结构设计器列出、创建(3 步向导,6 个模板)、复制和删除结构项目。
结构编辑器、表编辑器和 导出架构打开一个结构项目绘制表和关系、编辑列、导出 7 种格式、在控制台中 应用到 …。
工具 面板和工具栏网格图标;横屏平板上常驻显示搜索并打开 25 个工具中的任意一个。
切换数据库 和侧边面板点击标题;平板上是侧边面板切换数据库或连接,新建数据库,引擎,搜索连接和表。
在项目中使用引擎卡片上的 在项目中使用查看连接 URL,显示、复制 URL、在已打开的项目中写入 .env。
模块的更多屏幕工具面板、项目列表、在 Database 中打开服务商账号的项目、导入预览、查询历史、已保存的查询、图表、仪表板、监控、测试数据、安全、审计日志、分享、Redis、Firestore 以及 PlanetScale 部署差异:全部在「数据库工具」中。
最后一行中的屏幕,以及本页未涉及的工具面板中的工具,都记录在 数据库工具.

可以连接什么

该模块可打开 13 种数据库。你自己的 PostgreSQL 和 MySQL 服务器是你保存的连接;服务商账号来自你在 设置 → 集成 → 已连接的服务(或 Backend Manager)中连接的服务,需要联网。Firestore 使用你的 Firebase 项目。

引擎连接方式你可以做什么
PostgreSQL(本地)应用内的引擎:运行在 127.0.0.1:5433 的 PostgreSQL 18.2,无需账号。仅限 64 位 ARM 手机。本页的全部内容,外加引擎设置、扩展、服务器日志、带恢复的备份以及 在项目中使用。
PostgreSQL(你的服务器)直连你的主机,可选 TLS 和 SSH 隧道。表、数据、SQL 控制台、执行计划、创建表、ER 图、结构工具。
MySQL / MariaDBPocketCode 自己的 MySQL 客户端,可选 TLS 和 SSH 隧道。同上,只是不列出索引、外键和触发器,且执行计划为估算值。
Neon你的 Neon 账号。当应用能从你的账号读取项目的连接信息时,SQL 通过 JDBC 运行;否则通过 Neon 的 HTTP API 运行。带 只读 保护的 SQL 控制台、表、数据、执行计划、ER 图。
Supabase你的 Supabase 账号;SQL 通过其 API 跨所有 schema 运行。填入密码后,使用直接连接 会添加一个真正的 PostgreSQL 连接。与 Neon 相同。
PlanetScale你的账号会列出数据库和分支;分支会作为 MySQL 连接打开,并进行完整的证书校验。与 MySQL / MariaDB 相同。分支结构、结构检查和部署请求差异在「数据库工具」中。
Turso你的 Turso 账号;SQL 通过 Turso 的 HTTP API 发送。SQL 控制台、表、数据、ER 图(SQLite 执行计划没有成本)。
Cloudflare D1你的 Cloudflare 账号;与 Turso 类似,SQL 通过 D1 的 API 发送。与 Turso 相同。
MongoDB Atlas你的 Atlas 账号会列出集群;数据库用户和密码需要你自己输入。集合和计数,在「数据库工具」中。没有 SQL 控制台。
Upstash Redis你的 Upstash 账号;打开数据库时会作为真正的 Redis 数据库连接。Redis 工具,在「数据库工具」中。没有 SQL 控制台。
MongoDBPocketCode 自己的 MongoDB 客户端,支持 SCRAM 认证和 TLS。集合和计数,在「数据库工具」中。
RedisPocketCode 自己的 Redis 客户端,支持 TLS。键浏览器、CLI 和监控,在「数据库工具」中。
Cloud Firestore设置 → 集成 中的 Firebase 项目,或 Backend Manager 的 Google 会话。浏览和查询,在「数据库工具」中。
PocketCode 中间没有自己的服务器:应用直接与本地引擎、你的主机或服务商的 API 通信。这里共有 13 种连接类型,网站按 12 种引擎计算,因为本地引擎和你自己的 PostgreSQL 服务器是同一种引擎。DigitalOcean 的托管 PostgreSQL、MySQL 和 Redis 从 Backend Manager 的 托管数据库 打开,作为保存在内存中的普通 PostgreSQL、MySQL 或 Redis 连接(没有表单,也不计入连接数限制);它的其他引擎不能从那里打开。 MongoDB、Redis、Firestore、监控、安全、仪表板等内容见 数据库工具.

手机上的 PostgreSQL

这个引擎是为 Android 编译的 PostgreSQL 18.2,打包在应用内,适用于 64 位 ARM 手机(arm64-v8a)。它只在手机本机监听(127.0.0.1,端口 5433,用户 postgres),通过 TCP 连接时始终要求密码(SCRAM-SHA-256);密码是随机生成的、加密存储,没有它引擎拒绝启动。不需要 root、Termux 或网络。

启动引擎

从起始屏幕开始。

  1. 1点击 本地数据库。第一次使用时,应用会解压引擎并创建数据库集群,然后启动服务器并打开表列表。
  2. 2要停止引擎,点击引擎卡片上的 停止;要再次启动,点 启动。
  3. 3需要引擎的屏幕(表、数据、SQL 控制台、执行计划、结构树、ER 图等)在引擎关闭时会显示 引擎已停止 和一个 启动 按钮:「启动本地 PostgreSQL 引擎以使用其中的表。」
首次启动会解压约 36 MB 的包,并在手机上运行 initdb 创建集群(最多允许 10 分钟);这只会发生一次。应用不会让引擎在后台保持运行:你离开时,它会让 PostgreSQL 写入一个检查点,之后 Android 可能会停止该进程。首次运行的步骤(“Preparing…”、“Extracting…”、“Verifying…”)以及 Running / Stopped 标签在所有语言中都是英文。

你不能做的,以及原因

  • 引擎不会在后台常驻:Android 可能在没有任何提示的情况下杀掉进程,所以你回来时卡片可能显示 Stopped,需要再点一次 启动。Google Play 要求前台服务必须声明类型并有可见的用途,而「让 PostgreSQL 一直保持运行」不符合任何一种。Google Play
  • 引擎只提供 arm64-v8a 版本。在 x86 设备(模拟器、x86 Chromebook)上不可用。设备

引擎屏幕

点击引擎卡片上的 管理,或标题切换中的 引擎 打开它。工具中的 引擎设置、扩展 和 服务器日志 会在某个标签页上打开同一个屏幕(引擎设置 打开的是 健康,不是 设置)。它有四个标签页和一个 刷新 按钮。引擎停止时,每个标签页都会显示「引擎已停止。启动后才能查看状态。」

Landscape tablet: connection list on the left, Engine Health tab with PostgreSQL 18.2, sessions and slowest statements in the middle, and the Tools rail on the right
横屏平板:左侧是你的连接,中间是「引擎 → 健康」,右侧是工具栏

健康

正在运行的服务器的状态。

你可以

  • 查看 版本、已运行、数据大小、打开的会话、提交、回滚、缓存命中、检查点 和 死锁。
  • 在 数据库 下查看每个数据库的大小,并用 删除数据库 删除其中一个(需确认:「其中的一切都会被删除,且无法撤销。」)。
  • 查看 活动会话,并用 取消查询 或 终止会话 结束其中一个。
  • 通过 pg_stat_statements 查看 最慢的语句(调用次数、平均耗时、行数)。如果它未启用,启用 会执行 CREATE EXTENSION pg_stat_statements;要进行测量,还需要在 设置 中打开 语句统计 并重启。

你不能做的,以及原因

  • 对于 postgres(「“postgres”是引擎的维护数据库,无法删除。」)以及你当前连接的数据库,从不提供 删除数据库。有意为之

扩展

这个 PostgreSQL 包自带的扩展,共 17 个(btree_gin、btree_gist、citext、dblink、fuzzystrmatch、hstore、pageinspect、pg_freespacemap、pg_stat_statements、pg_trgm、pgcrypto、pgrowlocks、plpgsql、postgres_fdw、tablefunc、unaccent、uuid-ossp)。

你可以

  • 查看 最实用(pg_trgm、pgcrypto、uuid-ossp、citext、hstore、pg_stat_statements)和 全部可用,每个都有名称、版本和说明。
  • 用开关打开或关闭某个扩展:它会在当前打开的数据库中执行 CREATE EXTENSION 或 DROP EXTENSION。

你不能做的,以及原因

  • 你不能安装其他扩展:只有包内的 17 个,名称在执行前会与该列表核对。有意为之

日志

服务器自己的日志。

你可以

  • 查看服务器日志的最后 256 KiB,可按 全部、LOG、WARNING、ERROR 或 FATAL 筛选。
  • 复制 它,或以文本形式 分享。

你不能做的,以及原因

—

设置

引擎占用多少内存,以及写入有多安全。更改在保存时生效:引擎会重启。

你可以

  • 选择内存 配置档:轻量、均衡 或 强力。下方的一行说明它设置了什么,检测到的内存 显示手机报告的内存。
  • 切换 持久性 和 语句统计(「记录每条语句,健康页才能显示最慢的语句。需要重启。」)。
  • 复制 URL 会复制完整的连接 URL,包含密码。
  • 保存(仅在有更改时可用;保存并重启:「设置已应用 — 引擎已重启。」)和 重启引擎。

你不能做的,以及原因

  • 端口固定为 5433,引擎只监听 127.0.0.1:它从不暴露到网络。有意为之
  • 只有当 Android 报告内存达到 8 GiB 或更多时,才会提供 强力。设备
Engine Extensions tab with pg_trgm switched on
引擎 → 扩展:启用 PostgreSQL 自带的扩展
Engine Settings tab with Light, Balanced and Powerful profiles and the Durability switch
引擎 → 设置:内存配置档和持久性

内存配置档

配置档设置内容
轻量16 MB 共享内存 · 每次排序 2 MB · 最多 10 个连接 · 128 MB effective_cache_size · 2 个工作进程。内存低于 6 GiB 时为默认。
均衡64 MB 共享内存 · 每次排序 4 MB · 最多 20 个连接 · 512 MB effective_cache_size · 3 个工作进程。从 6 GiB 起为默认。
强力128 MB 共享内存 · 每次排序 8 MB · 最多 30 个连接 · 1 GB effective_cache_size · 4 个工作进程。需要 8 GiB 或更多。

内存是 Android 报告的总量(ActivityManager.totalMem),按 GiB 计算:标称「8 GB」的手机可能报告得更少,因而不提供 强力。如果手机已无法承受已保存的档位,该档位会被调低。始终如此:不使用并行查询(max_parallel_workers = 0),时区为 UTC。

持久性

  • 开启(默认):full_page_writes = on 且 synchronous_commit = off。如果手机断电或 Android 杀掉应用,PostgreSQL 会自行恢复,但最后几毫秒内已提交的事务可能丢失;不会有任何损坏。
  • 关闭:更快,但 full_page_writes = off:写入过程中崩溃可能导致数据库损坏且无法恢复。界面会用琥珀色警告你。除非数据可以重新生成,否则请保持开启。

多个数据库

本地引擎可以容纳多个数据库。

你可以

  • 点击标题并选择 新建数据库;输入 数据库名称 并点击 创建。名称只保留字母、数字和 _。应用会立即切换到新数据库。
  • 每个数据库都会出现在同一个切换面板的 数据库 下;点击其中一个即可切换。扩展、表和查询都作用于当前打开的那个。

你不能做的,以及原因

  • 在 Free 上引擎只容纳一个数据库(postgres),所以 新建数据库 会直接弹出 Pro 提示;对话框和工具上都带有 Pro 徽标。Pro
  • 只有本地引擎可以切换数据库;其他连接都是固定的一个。有意为之

在代码中使用

引擎卡片上的 在项目中使用(引擎运行时)会打开 在项目中使用 面板。

  1. 1面板显示 连接 URL,密码被隐藏:postgresql://postgres:***@127.0.0.1:5433/<database>。
  2. 2显示 显示密码,隐藏 再次隐藏。复制 URL 复制面板当前显示的内容,所以在你点击 显示 之前复制的是隐藏密码的版本。引擎 设置 标签页中的 复制 URL 始终复制完整 URL。
  3. 3在已打开的项目中写入 .env 会询问「写入 .env?」,点击 写入 后把 DATABASE_URL 写入项目的 .env:它会替换第一个已有的 DATABASE_URL(重复项会被删除,被注释掉的会被忽略),并保留文件的其余内容。如果该文件或 .git 文件夹存在,.env 会被添加到 .gitignore。

你不能做的,以及原因

  • 即使开启了生物识别锁,显示 和 复制 URL 都不会要求指纹。尚未提供
  • 引擎停止时没有 URL(「本地引擎已停止,没有可提供的连接。启动后再回来。」),没有打开的项目时也无处写入(「没有打开任何项目,无处写入 .env。」)。有意为之
  • 没有 psql 或 pgpass:密码只能通过这个 URL 或环境变量离开引擎。有意为之

终端和 Node

引擎运行时,本地终端和 Node 脚本的环境中会有 DATABASE_URL、PGHOST、PGPORT、PGUSER、PGPASSWORD 和 PGDATABASE。在项目中执行 npm i pg 后,new Client() 无需任何配置即可连接。终端还提供一个现成的代码片段:Local PostgreSQL (Node)。

变量在会话开始时读取:启动引擎后请打开新的会话。SSH 会话拿不到这些变量。终端里没有 psql 或 pg_dump;备份请通过「备份」工具完成。

连接

我的连接(标题为 数据库)列出模块能打开的所有内容。打开和保存连接对所有类型都一样;每种类型打开后的行为见「连接类型」下方的表格。

连接列表

从起始屏幕的 我的连接 或标题切换中的 所有连接 打开。

你可以

  • 按分区查看你的连接:收藏、本地数据库、云端数据库 和 自定义连接,每个分区都有数量。每张卡片显示引擎的徽标、名称、部分隐藏的主机(••.••••.empresa.com:5432)、以文字显示的环境(当分组或颜色标签以 PROD 开头时显示红色 PROD)和一个状态圆点。
  • 点击卡片即可打开:本地引擎和你的服务器会打开它们的表,服务商账号会打开它们的项目,Redis 和 Firestore 会打开各自的浏览器。
  • 点击 +(新建连接)添加服务器。
  • 使用卡片上的 ⋮:编辑连接、复制(在名称后加上“(副本)”)、测试连接、加入收藏 / 取消收藏 和 删除(「删除连接“…”?此操作无法撤销。」)。删除时还会清除已存储的凭据;对于以 MySQL 方式打开的 PlanetScale 分支,还会在你的 PlanetScale 账号中撤销其分支密码。
  • 把你的连接保存在 PocketCode 账户中。在设置的 设置同步 对话框中打开 启用同步(云同步,Pro 功能)并勾选 连接(SSH/DB) 后,保存或编辑你自己的服务器、把 PlanetScale 分支作为 MySQL 打开以及删除连接,也会更新你的账户。只发送元数据:名称、主机、端口、引擎和分组标签;绝不发送用户名、密码、TLS 设置或应用另外保存的任何内容。云同步关闭,或该选项未勾选时,不会发送任何内容。没有主机的连接同样不会发送。

你不能做的,以及原因

  • 本地引擎的连接不能编辑或删除:「本地 PostgreSQL 连接由应用管理:无法更改其主机、端口或用户,也无法删除。」不过它提供 复制、测试连接 和收藏。有意为之
  • 在 Free 上,保存(或复制并保存)第二个你自己的连接会弹出 Pro 提示。本地引擎、服务商账号,以及通过 在 Database 中打开 打开的内存中的连接(Upstash、DigitalOcean)都不计入。打开 PlanetScale 分支,以及分享里的 打开… 和 粘贴,都受同一个上限约束。Pro
Connections list with Local PostgreSQL first and cloud databases below
连接 — 本地引擎在前,然后是你的云账号

新建连接与编辑连接

用于服务器,以及你想手动输入的服务商类型的表单。它默认打开在 Neon PostgreSQL 类型上。

  1. 1在 我的连接 中点击 +(新建连接)。
  2. 2在 连接字符串 中粘贴一个 URL,然后点击 解析连接字符串。它能识别 postgres://、postgresql://、mysql://、mariadb://、libsql://、turso://、redis://、rediss://、mongodb:// 和 mongodb+srv://,带不带 jdbc: 前缀均可;它会解码 %40 之类的转义、IPv6 主机和 MongoDB 副本列表。rediss、mongodb+srv 和 libsql 会自动打开 TLS。
  3. 3或者填写 连接名称、数据库类型、主机、端口、数据库(对 Redis 来说是 SELECT 的索引)、用户名 和 密码。
  4. 4在 外观 下选择一个 颜色(None、Production、Staging、Development、Testing、Custom、Local)和一个 分组。
  5. 5设置 SSL / TLS,如果需要,再设置 SSH 隧道(两者见下文)。
  6. 6点击 测试连接。结果会一直显示在 上次测试 下,包含服务器的 响应,如果成功还有 延迟。
  7. 7点击 保存。密码存入 Android 的加密存储,连接文件中不会包含密码。编辑连接时,把 密码 留空即可保留已保存的密码。

你可以

  • 数据库类型 选择器提供 PostgreSQL (Local)(仅在引擎提供的设备上)、PostgreSQL、MySQL / MariaDB、Neon PostgreSQL、Supabase、PlanetScale MySQL、MongoDB Atlas、Turso SQLite、Upstash Redis、Redis 和 MongoDB。Cloudflare D1 和 Cloud Firestore 不在选择器中:它们通过各自的账号接入。
  • 测试连接 是真测试:本地引擎用 SELECT version();PostgreSQL、MySQL 和 PlanetScale 返回版本和延迟(「已连接 — …」);Neon 和 Supabase 通过列出项目来测试(「已连接 — N 个项目」);MongoDB 和 Redis 用真正的 ping,包括 TLS 和认证。

你不能做的,以及原因

  • Turso、Upstash、Atlas 和 D1 无法在表单中测试:「… 暂时无法从应用内测试(缺少驱动)。」尚未提供
  • 在 Free 上,对第二个连接点击 保存 会弹出 Pro 提示。Pro

TLS

使用 TLS 位于 SSL / TLS 下。在 PostgreSQL 和 MySQL / MariaDB 上,打开后表单提供两种模式,默认选中 验证服务器。

你可以

  • 验证服务器:服务器证书会对照你手机信任的证书颁发机构进行校验,所以来自公共 CA 的证书无需任何文件即可使用。如果你的服务器使用自己的证书,请用 选择 CA 证书… 选择它的 CA(文件会被复制到应用的私有存储)。
  • 验证主机名(默认开启)还会检查主机名;关闭后只检查 CA。
  • 仅加密(不验证):加密流量,但不检查对方是谁。红色警告会提醒你,同一网络中的人可能冒充你的服务器;仅在使用自签名证书时才用它。

你不能做的,以及原因

  • 表单不提供 Disable、Allow 或 Prefer。以旧模式保存的连接,会把该模式显示为一个额外的标签,直到你选择另一个模式。有意为之
  • 在 Redis 和 MongoDB 上,使用 TLS 总是校验证书:没有仅加密的选项。有意为之

SSH 隧道

SSH 隧道 → 使用 SSH 隧道 通过跳板机访问数据库:SSH 主机、SSH 端口、SSH 用户,以及 密码 或 私钥(选择私钥…)。

你可以

  • 隧道把一个本地端口转发到跳板机所看到的数据库,所以你输入的数据库主机和端口,就是跳板机要访问的那个。
  • 第一次连接某台跳板机时,应用会显示「首次连接该服务器。指纹:…」并保存它。如果之后密钥发生变化,则提示「SSH 服务器的密钥已更改。连接已中止:可能是服务器重装,也可能有人在中间。」,并且不会发送任何内容。

你不能做的,以及原因

  • 只有 PostgreSQL 和 MySQL / MariaDB 使用隧道。每种类型的表单上都画着这个开关,但在 MongoDB、Redis、Neon 等类型上它不起作用。尚未提供
  • 带口令的私钥不能用:表单里没有口令输入框。有意为之
  • Android 上没有 SSH agent,而且只支持单个本地端口转发:不能链式跳转。有意为之

连接类型

连接后打开每种类型会发生什么。

类型会发生什么
Neon PostgreSQL选择一个项目。当应用能从你的账号读取项目的连接信息时,SQL 通过 JDBC 运行并进行完整的证书校验;否则通过 Neon 的 HTTP API 运行(「无法直接连接此 Neon 项目,改用其 HTTP API。这种方式不支持跨多条语句的事务,也无法获得真实的 EXPLAIN ANALYZE。」)。SQL 适用于使用默认 neondb 数据库和 neondb_owner 角色的项目。
Supabase选择一个项目;SQL 通过 API 跨所有 schema 运行(有多个 schema 时会出现 架构 标签)。API 不提供数据库密码,所以项目屏幕上的 使用直接连接 会打开一个已填入连接池主机、端口和用户的表单:输入一次密码,并把它保存为普通的 PostgreSQL 连接。
PlanetScale MySQL你的账号会列出数据库和 分支。点击某个分支,会在你的 PlanetScale 账号中创建一个分支密码,并把该分支作为 MySQL 连接打开,进行完整的证书校验。在 Free 上,尚未打开过的分支算作你自己的一个连接:已经保存了一个时,点击会弹出 数据库 Pro 提示,也不会创建密码。删除该连接会撤销这个密码;如果撤销失败,应用会提示你去 PlanetScale 控制台中操作。
Turso SQLite你的账号会列出数据库;SQL 通过 Turso 的 HTTP API 发送。
Cloudflare D1你的账号会列出数据库(D1 始终在列表中),并直接打开它的表;SQL 通过 D1 的 API 发送。
MongoDB Atlas你的账号会列出集群。选择一个会打开已填好 SRV 主机的表单,数据库用户和密码需要你自己输入(Atlas 不会提供)。mongodb+srv:// 主机通过 DNS over HTTPS 向 dns.google 解析,失败时回退到 cloudflare-dns.com。
Upstash Redis你的账号会列出数据库;打开其中一个时,会作为真正的 Redis 数据库连接;当 Upstash 的 API 没有给出 Redis 密码时,则通过 REST 连接。该连接保存在内存中。
MongoDB、Redis、Cloud Firestore它们的浏览器和工具在「数据库工具」中。

表与数据

点击一张表即可打开。每页 100 行,按主键排序,所以你编辑过的行会停留在原位。

表列表

当前连接的表和视图。点击某个连接打开,或从 工具 → 表 打开。

你可以

  • 用 搜索表… 搜索。列表包含 表(每张显示「~N 行 · 大小」,~ 表示估算的行数,适用时还有 系统 徽标)和 视图;PlanetScale 会多出 分支,Supabase 在有多个 schema 时会有 架构 标签。
  • 点击表或视图打开其数据。每行的 ⋮ 提供 数据、结构、导出 和收藏。
  • 点击 +(创建表)打开建表表单。
  • 列表的 ⋮ 中有 导入 CSV(打开导入预览,支持 CSV、TSV、JSON、NDJSON、SQL 和 XLSX;见「数据库工具」),仅在本地引擎上还有 从剪贴板导入 和 架构差异。

你不能做的,以及原因

  • 创建表 只在本地引擎、PostgreSQL 服务器和 MySQL 服务器(以及已打开的 PlanetScale 分支)上提供;Neon、Supabase、Turso、D1 和 PlanetScale 账号上没有。在那里请在控制台中运行 CREATE TABLE。有意为之
  • 在 Free 上,连接中已有 4 张表时,创建表 带有 Pro 徽标,创建第 5 张表(通过表单、用「Create table」导入,或在控制台中执行 CREATE TABLE)会弹出 Pro 提示。Pro
  • MySQL / MariaDB 不列出索引、外键或触发器(「… 不提供索引信息。」),其行数是目录的估算值。有意为之

数据查看器

标题栏显示表名;副标题显示 数据库 · 连接。行数对每张表和每组筛选只计算一次。

你可以

  • 顶部栏有 筛选、排序、列、视图、一个刷新图标、范围(1-100 of 240,总数未知时显示 第 N 页)以及 上一页 / 下一页。
  • 点击列标题排序;长按它可以使用 冻结列 / 取消冻结、自适应宽度、重置宽度 以及 紧凑 / 宽松 行距。
  • 长按单元格:如果它不属于主键,就可以编辑;如果属于主键,则开始选择行。点击某一行打开 行详情。
  • 标题栏的 ⋮ 中有 插入行、添加列、表详情 和 导出。
  • 插入行 会打开一个表单,每列一个字段,标签是列名、类型,如果是主键还带有 PK。字段留空时,该列使用默认值(或 NULL、自增值)。暂存行 把 INSERT 加入队列(至少要填一个字段,否则应用会提示),应用 再执行它。没有主键的表也可以用。

你不能做的,以及原因

  • 编辑和删除需要可用的主键(且这一行中没有设为 NULL 的主键);否则应用无法安全地识别行,什么都不会应用。插入行 不需要主键。有意为之
  • 主键不能逐个单元格编辑:长按它会选中这一行。有意为之
  • 在开启 只读 的 Neon、Supabase、Turso 和 D1 上,编辑、删除以及 Drop / Truncate / Rename 都会被阻止:「此数据库处于只读状态,因此没有做任何更改。请在 SQL 控制台编辑器上方关闭「Read-only」后再修改。」有意为之
  • 没有总数时(Supabase,或 COUNT(*) 失败),栏中显示 第 N 页,只有当该页被填满时 下一页 才会前进。第三方
The customers table with Filter, Sort, Columns and the page range
一张表 — 筛选、排序、列和分页都在同一行
Filter sheet with column, operator and value fields
筛选在服务器上执行,而不只是在屏幕上

筛选

筛选缩小的是数据库返回的内容,而不只是你看到的内容:多个筛选以 AND 组合,并在服务器上作为 WHERE 运行。

你可以

  • 选择 选择列,选择一个 运算符(更改),可选 =、!=、>、<、>=、<=、LIKE、NOT LIKE、IS NULL、IS NOT NULL、IN 和 BETWEEN,输入 值,然后点击 添加筛选。
  • 已启用 列表中有 移除筛选,全部清除 会清空它。IN 接受用逗号分隔的值;值按带引号的文本比较;IS NULL 和 IS NOT NULL 不需要值。

你不能做的,以及原因

  • BETWEEN 在运算符列表中,但面板只有一个值输入框,没有「从 / 到」:它会生成 BETWEEN 'x' AND ''。请改用两个筛选:>= 和 <=。尚未提供

列

显示、隐藏并设置这张表各列的格式。

你可以

  • 逐列打开或关闭,或点击 显示全部。
  • 为某一列设置 格式:无格式、Stars、Progress Bar、Boolean、Link 或 Color。
  • 被规则遮蔽的列(见「数据库工具」)会显示一个锁;明文显示 会在本次会话中显示明文,开启生物识别锁时会要求指纹。

你不能做的,以及原因

—

已保存的视图

视图 会记住查看一张表的方式。

你可以

  • 用 保存当前视图 和一个 视图名称 保存:它会为这个连接和这张表存储筛选、排序、可见列、列宽和冻结列。
  • 点击一下即可应用某个视图(全部,未筛选 会清除它们),或将其 删除。

你不能做的,以及原因

  • 已保存的视图保留在这台设备和这个账号上:共享 导出的是连接和已保存的查询,不包括视图。有意为之

编辑单元格并应用更改

编辑会在队列中等待,直到你应用它们。

你可以

  • 长按一个不属于主键的单元格,修改 值 或打开 NULL,然后点击 保存。该单元格会高亮,底部出现一条显示「N 项更改」的栏。
  • 查看 SQL 显示确切的语句(UPDATE … SET col = value WHERE <every primary-key column>),放弃 丢弃它们,应用 执行它们。

你不能做的,以及原因

  • 应用 逐条执行语句,遇到第一个错误就停止,且没有事务:「已应用 %1$d / %2$d:…」。出错之前的语句仍保持已应用。有意为之
  • 待执行的 SQL 不能编辑,只能应用或丢弃。有意为之

行详情

点击一行(没有处于选择状态时)。在横屏平板上,它会作为网格旁的面板打开,而不是替换网格。

你可以

  • 查看这一行的主键(或「第 N 行」),点击 复制 JSON 把每个值复制为文本或 null。
  • 每列一个可编辑字段,各自标有类型以及 PK、FK、NOT NULL 徽标;可为空的列有一个 NULL 开关,JSON 使用多行等宽输入框。
  • 页脚显示「无更改」或「N 项更改」;保存 只会把你改过的字段加入队列并应用。

你不能做的,以及原因

  • 没有上一行 / 下一行导航,也不能在这里删除;没有可用的主键时无法保存。有意为之

选择行

长按主键列的一个单元格开始选择。

你可以

  • 用复选框勾选行;栏中显示「已选 N 项」,并带有 清除。
  • 复制为 把所选行以 CSV、TSV、JSON、NDJSON、SQL (INSERT)、SQL (full) 或 Markdown 格式复制到剪贴板。
  • 导出 提供相同的格式,外加 Excel(XLSX),写出一个文件并打开系统分享面板。
  • 删除 为每一行排入一条 DELETE … WHERE <primary key>,经过安全模式,然后等待 应用。

你不能做的,以及原因

  • 这里的 导出 会分享一个文件,不询问保存位置;要选择文件夹,请使用 ⋮ → 导出。有意为之
Row detail form for id = 2 with typed fields and NULL switches
行详情 — 带类型的字段和真正的 NULL 开关
Three selected rows with Copy As, Export and Delete in the bottom bar
长按主键列来选择行

添加列

⋮ → 添加列 会打开 新建列。

你可以

  • 填写 名称、类型(与 创建表 中相同的 15 种)、NN 和 UQ 标签以及 默认值;预览会显示 name TYPE NOT NULL UNIQUE。
  • 点击 添加列,以该连接的方言执行 ALTER TABLE … ADD COLUMN。

你不能做的,以及原因

  • 对已有行的表,NOT NULL 列需要默认值,否则按钮会被禁用,并提示:「该表已有 N 行。NOT NULL 列需要默认值,否则数据库无法为已有行填入内容。」有意为之
  • 这个表单里没有 PK 或 AI 标签,只有 NN 和 UQ。有意为之

表详情

查看器中的 ⋮ → 表详情,或表列表某一行上的 结构。

你可以

  • 查看五个标签页:列(类型、PK / FK / NOT NULL、默认值、引用)、索引、键(主键 和 外键)、触发器 和 DDL,并带有 复制 DDL。
  • 使用 危险区域:重命名、清空 和 删除表。每一项都会要求确认并经过安全模式。在 SQLite 引擎(Turso、D1)上,清空表会执行 DELETE FROM。

你不能做的,以及原因

  • 当某个引擎不提供索引、键、触发器或 DDL 时,标签页会如实说明(「该引擎不返回表的 DDL。」),而不是显示一个空列表。有意为之
  • 你不能在这里编辑索引、键或触发器。有意为之
  • 在云数据库上,只读 会阻止 Drop、Truncate 和 Rename。有意为之

创建表

表列表中的 创建表,或 工具 → 新建表。

你可以

  • 输入 表名。为每一列设置 名称、类型(SMALLINT、INTEGER、BIGINT、REAL、DECIMAL(p,s)、CHAR(n)、VARCHAR(n)、TEXT、BLOB、BOOLEAN、DATE、DATETIME、TIMESTAMP、JSON 或 UUID)、PK、AI、NN 和 UQ 标签以及 默认值。可以随意添加和删除列。
  • 点击 创建,以该连接的方言执行 CREATE TABLE IF NOT EXISTS(PostgreSQL 上使用 SERIAL / BIGSERIAL 和 BYTEA,MySQL 上使用 AUTO_INCREMENT,UUID 对应 CHAR(36))。列表会重新加载。

你不能做的,以及原因

  • 表单里没有外键、索引或 CHECK 约束,只有按列设置的标志。有意为之
  • 在 Free 上,已有 4 张表时,创建 会弹出 Pro 提示。Pro

导出表

⋮ → 导出、表列表中某一行的 ⋮、工具 → 导出(仅在打开了一张表时),或控制台结果下方的 导出。

你可以

  • 选择 格式(CSV、TSV、JSON、NDJSON、SQL (INSERT)、SQL (full)、Markdown 或 Excel (XLSX)),启用筛选时再选择 行:筛选后的行(N) 或 整张表。
  • 点击 保存到… 并选择保存位置。「已写入 N 行」会不断计数。表按每批 1,000 行读取、逐行写入,所以没有大小限制。

你不能做的,以及原因

  • 导出控制台结果只会写出屏幕上的行(最多 500 行),并且不会重新运行查询。有意为之
  • 没有单列主键的表会用 LIMIT/OFFSET 读取,所以导出期间的写入可能让结果错位;没有主键的表没有保证的顺序。有意为之

SQL 控制台

从 工具 → SQL 控制台 打开。它出现在能运行 SQL 的连接上:本地引擎、你的 PostgreSQL 和 MySQL 服务器、Neon、Supabase、已打开的 PlanetScale 分支、Turso 和 Cloudflare D1。如果已打开某张表且编辑器为空,它会以 SELECT * FROM <table> LIMIT 50 开始。

编辑器

一个编辑器适用于所有方言。

你可以

  • 行号和按连接方言(PostgreSQL、MySQL 或 SQLite)进行的语法高亮。自动纠错和自动大写已关闭。
  • 工具栏中有 撤销、重做、格式化 和 AI;⋮ 菜单中有 新建标签页、查询历史、已保存的查询、查询参数(仅当查询含有参数时)以及 缩小字号 / 放大字号。
  • 从第二个字符起会以标签形式出现建议,最多十个:最多 5 个关键字、5 张表、3 个视图、当前表的 5 个列和 3 个函数。
  • 键盘打开时,上方有一排按键:fx(在单词和该方言最多 24 个函数之间切换)、符号 ( ) , ; = * ' " < > . :、十一个单词(SELECT、FROM、WHERE、JOIN、ON、GROUP BY、ORDER BY、LIMIT、INSERT、UPDATE、DELETE),以及固定在右侧的 运行。
  • 布局会自适应:竖屏手机上是 编辑器 | 结果 切换,横屏手机上是带可拖动分隔线的两列(20–80 %,双击恢复 50/50),竖屏平板上是 30 / 50 / 70 % 的行,横屏平板上是带标签栏的列。

你不能做的,以及原因

  • MongoDB、Redis、Upstash 和 Firestore 没有 SQL 控制台:它们的屏幕就是连接本身,也不提供这个工具。有意为之

运行、停止与限制

点击 运行 时会发生什么。

你可以

  • 运行 运行整个编辑器(只运行选中内容用 Ctrl+Shift+Enter)。运行期间,结果 显示「正在运行 · N 秒」,运行 变为 停止。
  • 不带 LIMIT 的普通 SELECT 会被加上 LIMIT 500(WITH …、COUNT / SUM / AVG / MIN / MAX 查询,或文本中已包含 LIMIT 时不会添加)。远程连接最多保留 500 行。查询在本地引擎上 30 秒后被中断;在远程服务器上,套接字等待 60 秒(另加 10 秒用于连接)。
  • 不返回行的语句会说明发生了什么:「表已创建 · 53 毫秒」、「影响了 3 行 · 8 毫秒」、「语句已执行 · …」。
  • 在本地引擎、你的 PostgreSQL 服务器和 MySQL 上,停止 会在服务器上取消查询:「已在服务器上取消查询。」
  • 每次运行都会进入历史记录(500 条)和审计日志(1,000 条),如果创建或删除了内容,还会重新加载表列表。

你不能做的,以及原因

  • 在 Neon、Supabase、Turso 和 D1 上,停止 只是停止等待:「已停止等待该查询。服务器可能仍在执行。」有意为之
  • 每次运行都会打开独立的连接,因此一次运行中的 BEGIN 和下一次运行中的 COMMIT 不构成一个事务。有意为之
SQL console with a formatted query joining customers and orders
SQL 控制台 — 工具栏中有语法高亮、格式化和 AI
Results: 12 rows with name and email columns and the result actions below
结果 — 行数、耗时,以及可以对结果做什么

安全模式

在运行危险语句之前,控制台会显示 危险操作(「这将执行 … 操作」),附上确切的 SQL 和「预计影响行数」。在你点击 仍要执行 之前什么都不会运行;取消 则放弃。

你可以

  • 它会在以下情况触发:不带 WHERE 的 DELETE 或 UPDATE、DROP TABLE、DROP VIEW、DROP INDEX、CTE 中不带 WHERE 的 DELETE,以及任何包含 TRUNCATE 的文本。
  • 在 MySQL / MariaDB / PlanetScale 上,列表更长:DROP DATABASE、ALTER TABLE … DROP、RENAME TABLE、用户和权限管理(GRANT…)、KILL、FLUSH、RESET、LOAD DATA、INTO OUTFILE、SET GLOBAL、SHUTDOWN、REPLACE INTO、插件和 LOAD_FILE()。
  • 表的 Drop、Truncate 和 Rename、删除行,以及在引擎屏幕上删除数据库,也都会经过它。

你不能做的,以及原因

  • 安全模式没有开关:它始终开启。有意为之

参数

命名参数会把查询变成模板。

  1. 1在查询中写命名参数:SELECT * FROM orders WHERE status = :status AND total > :min;
  2. 2点击 运行。控制台不会直接执行,而是打开 查询参数,每个参数名一个输入框。
  3. 3填写值并点击 运行。值以带引号的文本发送。编辑器中保留带 :names 的查询,历史记录中也一样。

你不能做的,以及原因

  • 只有 :name 会要求输入值;@name 和 $1 能被识别,但不会弹出提示。没有类型:每个值都按文本发送。有意为之

标签页

一次处理多个查询。

你可以

  • ⋮ → 新建标签页(横屏平板上是标签栏的 +)。在手机上,有两个或更多标签页时才会出现标签栏。
  • 点击标签页切换,✕ 关闭,长按重命名。每个标签页都会保留自己的 SQL 和结果,关闭应用后标签页也还在。始终至少有一个。

你不能做的,以及原因

  • 在 Free 上,第三个标签页会弹出 Pro 提示。Pro

如何处理结果

结果网格下方有一排操作,标题栏中还有一个图标。

操作作用
复制为以 CSV、TSV、JSON、NDJSON、SQL (INSERT)、SQL (full) 或 Markdown 格式复制到剪贴板。标识符按连接所用引擎的方式加引号(PostgreSQL 上不用反引号)。
导出用屏幕上的行打开 导出。
图表用结果生成图表(需要两列或更多列)。见「数据库工具」。
解释打开编辑器中查询的执行计划。
保存查询用一个 查询名称 保存它。
添加到仪表板(标题栏图标)查询运行后,把它保存为仪表板小组件。见「数据库工具」。

你不能做的,以及原因

  • 在 Free 上,已有 5 条已保存的查询后,保存查询 会弹出 Pro 提示。Pro

历史记录与已保存的查询

⋮ → 查询历史 或 已保存的查询 会在控制台中打开一个面板。

你可以

  • 选择一个条目,把它载入编辑器。
  • 用 查询名称 保存查询,删除 条目,并把已保存的查询移入文件夹(未分类)。

你不能做的,以及原因

  • Free 上可保存 5 条查询;第六条会弹出 Pro 提示。Pro
  • 历史记录只保留最近 500 条。有意为之

用 AI 编写 SQL

助手就在编辑器里,位于你的代码上方。它只给出建议;在你接受之前不会写入编辑器,也不会自行执行任何内容。

你可以

  • 点击 AI。代码上方会出现一行 描述你需要的查询…;用你自己的话描述查询,然后点击 生成。快捷方式:把需求写成光标所在行的注释,例如 -- customers who ordered this month,然后点击 AI。
  • 阅读建议。它上方是来源(提供商和模型,或 离线 — 由规则生成,非模型)、说明,以及在备选方案之间切换的箭头;重新生成 会重新询问。
  • 接受 会把它放进编辑器,替换选中内容,或放在光标下方的新行。放弃 则让编辑器保持原样。破坏性的建议会带有「Destructive operation — review carefully」。

你不能做的,以及原因

  • 没有连接任何提供商时,助手会退回到内置的规则生成器来处理简单查询,并说明原因:「未连接任何 AI 提供商。请在 AI 设置中连接一个,由模型来编写查询。」如果提供商超过 90 秒没有响应:「AI 提供商在 90 秒内没有响应,因此未使用模型。」需要网络
  • 如果模型回答的不是 SQL,你会在「模型未返回 SQL」下看到它的回答,且没有 接受 按钮。有意为之
  • 它知道什么:方言,以及最多 40 张表和视图的名称及其列(最多 6,000 个字符),所以当列名为 ciudad 时它会写 ciudad。不会发送任何行数据。
  • 使用哪个模型:AI 设置中为 SQL 助手 设定的模型、你手动选择的模型,或自动模式下的快速模型。
  • 授权:首次使用某个服务商时,应用会在发送任何内容之前询问 发送给 …?。

云数据库:只读、确认与指纹

在 Neon、Supabase、Turso 和 Cloudflare D1 上,控制台在写入之前会先询问。编辑器上方的固定一行有 只读 开关(「写入已被阻止」/「写入前会先确认」)。

你可以

  • 只读 默认开启,按数据库计算(切换项目会让它重新开启):只发送读取。运行写入时会提示「“只读”已开启,因此未发送此写入。请在编辑器上方关闭“只读”后再运行。」
  • 关闭后,每次写入都会打开「写入 …?」,列出它将做什么(创建表、删除表、清空表、插入行、更新符合条件的行、更新所有行(无 WHERE)…);运行 确认。
  • 破坏性写入(DROP、TRUNCATE、不带 WHERE 的 DELETE 或 UPDATE…)的标题是「对 … 的破坏性写入」,按钮是 继续,随后会要求指纹或设备 PIN(「确认破坏性写入」)。没有屏幕锁的手机会视为已经确认而继续。
  • 同一个开关也管控数据网格中的编辑、Drop / Truncate / Rename,以及写入语句的实测计划。

你不能做的,以及原因

  • AI 聊天遵守这个开关,不能在云数据库上运行破坏性写入:它会把 SQL 交给你,由你在 SQL 控制台中运行。有意为之

执行计划

工具 → 执行计划,或结果下方的 解释。编辑器中需要有一条查询:「请先写一条查询 —— 执行计划说明的是它会怎么跑。」

你可以

  • 以树形查看计划,每一步都有代价条,最耗资源的一步以红色显示,并标注「由查询规划器估算 —— 该查询并未执行」或「实测 —— 该查询确实执行了」,以及「规划:N 毫秒」和「执行:N 毫秒」。点击某一步可查看 步骤详情(步骤、表、总代价、自身代价、行数、行宽)。刷新图标会重新请求,并保持是否实测的状态。
  • 在 PostgreSQL 方言上点击 真实执行分析(「实际执行该查询并测量每一步,而不是估算。」):即本地引擎、Neon、Supabase 和你的 PostgreSQL 服务器。如果语句不是只读的,它会询问「要执行这条语句吗?」:「这不是只读语句,而测量就意味着执行:它会改动你的数据。」
  • 当出现带筛选的顺序扫描且估算至少 100 行时(引擎不给出估算则不设这一下限),查看 建议的索引;每条建议都有 复制。「这里不会创建任何东西:复制语句,到控制台再做决定。」
  • 点击 用 AI 解释 让你的模型解释这个计划。它会发送引擎、查询和计划,并说明「这段文字由 … 根据计划的 JSON 写成。照做之前请先核对。」每个提供商第一次使用时会询问 发送给 …?

你不能做的,以及原因

  • MySQL / MariaDB / PlanetScale 只给出估算的计划,SQLite(Turso、D1)给出不带代价的树(「该引擎不提供代价数据:它只说做了什么,不说花了多少。」)。那里不会显示 真实执行分析。有意为之
  • 在云数据库上,对写入语句使用 真实执行分析 要遵守 只读,如果会破坏数据,还会要求指纹。有意为之
  • 通过 HTTP 连接的 Neon 项目没有真正的 EXPLAIN ANALYZE。第三方
  • 它从不创建索引,只会复制 CREATE INDEX。有意为之
Measured execution plan tree with an index suggestion
实测的执行计划:红色步骤就是开销最大的

结构:树、ER 图、设计器与对比

表、关系和设计。结构树、ER 图、导入和对比适用于任何能运行 SQL 且有表的连接。

结构树

工具 → 结构树。在横屏平板上,同一棵树挂在侧边面板中当前连接的下面。

你可以

  • 展开连接名称,然后是 Tables (N) 和每张表:它的列(name: type,主键上标有 PK),以及(在列出的情况下)它的索引(name (columns));Views (N) 包含视图。当行数已知时,表会显示「(N rows)」。这棵树的标签在所有语言中都是英文。
  • 点击某张表或某一列,打开该表的数据。
  • 在 PostgreSQL、Neon、Supabase、Turso 和 D1 上会列出索引;MySQL / MariaDB 上没有。

你不能做的,以及原因

  • 屏幕还画出了 函数 / 存储过程、序列、枚举 / 自定义类型 和 依赖项 分区,但它们从不会被填充。尚未提供
  • 触发器被有意排除在树之外。有意为之

ER 图

工具 → ER 图。它会绘制任何带表的 SQL 连接的表和关系:本地引擎以及你的 PostgreSQL 和 MySQL 服务器通过各自的驱动,Neon、Supabase、Turso 和 D1 则通过 SQL 读取它们的目录。

你可以

  • 用捏合和拖动操作画布。标题显示「N 个表 · M 个关系」;缩小时显示「已隐藏列名,放大即可阅读」。点击某张表打开它的数据。
  • 使用工具栏:作为设计编辑(把结构复制到设计器中)、选择表(全选 / 清除;不选任何一项表示全部)、适应屏幕、自动排列、放大和缩小、按架构着色、缩略图 和 导出图表(2 倍大小的 PNG,使用主题背景;文件选择器建议的文件名是 er-diagram.png)。

你不能做的,以及原因

  • MongoDB、Redis、Upstash 和 Firestore 没有 ER 图,而且它从不会回退到 PocketCode 自己的存储。有意为之
  • 复合外键会被画成多条单列关系。尚未提供
  • 图不能原地编辑:请使用 作为设计编辑。有意为之
ER diagram with customers, orders and subscribers
本地数据库的 ER 图

结构设计器

从起始屏幕(架构设计器,无需连接)或 工具 → 结构设计器 进入。项目是应用私有存储中的 JSON 文件。

你可以

  • 项目列表有 搜索架构…、显示「N 个表」和「N 个关系」的卡片、带 复制 和 删除 的 ⋮,以及 新建架构。
  • 向导 新建架构项目 有三步:项目详情(项目名称、描述)、目标数据库(MySQL、PostgreSQL、SQLite、MariaDB、SQL Server 或 MongoDB)和 从模板开始:空架构,或 Blog(6 张表)、E-Commerce(8)、Social Network(7)、SaaS Platform(7)、Chat App(5)、Project Management(7)。返回、继续、创建项目。
  • 在编辑器中,可以拖动表、缩放以适应、添加表、撤销 / 重做,并通过先点击源列再点击目标表来绘制关系(1:1、1:N、N:M;No Action、Cascade、Set Null、Set Default 或 Restrict)。项目名称可编辑,并有一个标签显示目标引擎。
  • 表编辑器面板可以重命名表、设置颜色并添加列:名称、类型(选择列类型,带建议和保留字警告)、约束(主键、自动递增、非空、唯一、已建索引)、长度、精度、小数位数、默认值、注释 和 添加外键。
  • 应用到 … 会在控制台中打开脚本但不执行,每条破坏性语句都标有 -- ⚠:「脚本已在控制台打开:N 条语句,其中 M 条标记为 ⚠。尚未执行任何语句」。

你不能做的,以及原因

  • 应用到 … 从不执行脚本:这是模块中最具破坏性的操作,所以它要经过控制台的安全模式和套餐的表数量限制。它需要一个 SQL 连接(「打开一个 SQL 连接后才能应用此设计」)并且至少有一张表。有意为之
  • 设计器本身没有 Pro 限制,但在 Free 上,在控制台中执行脚本时,其中的 CREATE TABLE 语句会碰到 4 张表的上限。Pro
  • 项目保存在这台设备上:不会在设备之间同步,而且 MongoDB 目标只会调整列类型。有意为之

导出结构

结构编辑器中的 导出 会打开 导出架构。

你可以

  • 选择七种格式之一:SQL DDL、Room Entity、Prisma、TypeORM、Django、JSON Schema 或 DBML,然后点击 生成 …。
  • 查看 生成的输出(「N 行」),然后 全部复制(「已复制!」)或以文本形式 分享。

你不能做的,以及原因

  • 它只生成文本,不会碰任何数据库:想在控制台中得到脚本,请使用 应用到 …。有意为之

导入结构

工具 → 导入结构(至少有一张表的 SQL 连接),或 ER 图中的 作为设计编辑。

你可以

  • 把当前数据库的表、列、索引和外键带入设计器。之后它会列出无法导入的内容(「有 N 项无法导入」)。

你不能做的,以及原因

  • 不使用 SQL 的引擎没有可导入的结构(「… 不使用 SQL,因此没有可导入的结构」)。有意为之
  • 在 SQLite(Turso、D1)上不会导入索引,复合外键会变成多条单列外键。尚未提供

对比结构

工具 → 对比结构,或表列表的 ⋮ → 架构差异(本地引擎)。这是 Pro 工具。在 PlanetScale 项目上,同一个入口显示最近一次部署请求的差异,且免费(见「数据库工具」)。

你可以

  • 点击 保存快照(为这个连接保存结构:「已保存架构快照(N 张表)」),修改结构,然后点击 运行差异比较。
  • 查看 新增的表、移除的表 和 修改的表(列用 + name: type 和 − name 表示)。
  • 点击 生成迁移,把 SQL 写入控制台而不执行:按引擎的引用规则加上引号,新表带完整的 CREATE TABLE,并包含类型和可空性的变更。

你不能做的,以及原因

  • 在 Free 上,从工具或菜单打开它,或点击 运行差异比较,都会弹出 Pro 提示。Pro
  • 它比较的是表和列(名称、类型、可空性),不比较索引、外键、视图或序列。有意为之
  • 屏幕只列出新增和移除的列;类型或可空性发生变化的列不会显示在那里,尽管它包含在迁移中。尚未提供

备份

工具 → 备份(标题为 备份与恢复)在每个连接上都有,但只有本地 PostgreSQL 能被备份。它有三个标签页:创建、历史 和 计划。

创建

备份会写入应用的存储空间;你的文件 用来把转储文件导入和导出。

你可以

  • 选择 备份方式(pg_dump 或 SQL Dump),添加 备注(可选),然后点击 开始备份(「已写入 …」)。
  • 在 你的文件 下,保存到… 会把转储文件直接写入你选择的文档,导入备份… 会导入 .sql 或 pg_dump -Fc 文件:方法由 PGDMP 签名决定,而不是扩展名。保存和导入都通过系统文件选择器,所以文件最终位于你选择的位置,卸载应用后仍然保留。

你不能做的,以及原因

  • 其他连接会说明原因:「<engine> runs on a server, so its backups belong to that provider. PocketCode can only back up databases stored on this device.」或「<engine> is not a SQL database — export its collections/keys instead.」有意为之
  • 没有云端目的地(Drive、Firebase):备份文件夹是应用私有的,只有通过 保存到… 或 导出 写到它之外的内容,才能在卸载后保留。有意为之

历史记录与恢复

每一份备份,最新的在前。

你可以

  • 每行显示日期、方式、「N 个表 · 大小」,以及 已导入 和 已排程 徽标,并带有 恢复、导出 和 删除。还没有备份时显示「暂无备份」;计划任务失败后显示「上一次备份失败」。
  • 恢复 会询问「要覆盖数据库吗?」。会先保存当前数据库的副本(pre_restore_<time>.dump),所以可以撤销;结果显示「已恢复 — … 原数据库保留为 …」。PGDMP 转储用 pg_restore 恢复;文本转储通过 JDBC 重放。

你不能做的,以及原因

  • 如果安全副本失败,就不会恢复任何内容。有意为之
Backup History tab with a pg_dump backup and restore, export and delete buttons
备份 — 恢复前会先做一份安全副本

计划

用于自动备份的 Pro 开关。

你可以

  • 打开 定时备份,并设置 频率(Every hour、Every 6 hours、Every 12 hours、Daily 或 Weekly)、时间(默认 3)和 保留的最大备份数(默认 7)。它通过 WorkManager 在后台运行,电量或存储空间不足时会跳过。

你不能做的,以及原因

  • 打开或更改计划是 Pro(SCHEDULED_BACKUP)。创建、恢复、导出、导入和删除备份都是免费的。Pro
  • 没有前台服务,也没有精确闹钟:系统可能推迟或杀掉这次运行,结果会记录在历史中。Google Play
  • 计划任务运行时,只有当引擎此刻正在运行,才会复制本地 PostgreSQL(你最后打开的数据库);它从不启动引擎。它还总是会复制 PocketCode 自己的内部应用数据库,存放在单独的存储中,本屏幕不显示其历史。有意为之

工具

网格图标会打开 工具:六个分区中的 25 个工具,带搜索框和一行 常用。在横屏平板上它是常驻工具栏(280 dp,折叠时 72 dp)。不适用于当前连接的内容会被隐藏,而不是置灰:使用 MongoDB、Redis、Upstash 或 Firestore 时只会出现九个工具(表、仪表板、结构设计器、导出、备份、监控、安全、审计日志 和 共享)。

分区工具
浏览表、结构树、ER 图 — 见本页。
查询SQL 控制台 和 执行计划 — 见本页。查询历史、已保存的查询、图表 和 仪表板 — 见「数据库工具」。
设计结构设计器、新建表、对比结构(Pro)和 导入结构 — 见本页。
数据导出 和 备份 — 见本页。测试数据 和 导入 — 见「数据库工具」。
服务器引擎设置、扩展、服务器日志 和 新建数据库(Free 上带 Pro 徽标)— 见本页。监控 — 见「数据库工具」。
安全安全、审计日志 和 共享 — 见「数据库工具」。

引擎的启动和停止不在目录中:它们位于引擎卡片和引擎屏幕上。

监控、安全、审计、仪表板、图表、测试数据、导入、历史记录、已保存的查询和分享的内容见 数据库工具.

从 AI 聊天使用

AI 聊天无需打开模块即可使用你的数据库。用自然语言提问(“我有哪些表?”、“有多少订单退款了?”),它会调用以下工具:

工具作用
db_list_connections列出本地引擎和你已保存的连接,以及你所连接云服务的项目(格式为 service/project)。
db_list_tables数据库中的表名。
db_schema某张表或所有表的列和类型。
db_query执行只读语句:SELECT、WITH、EXPLAIN、SHOW 或 DESCRIBE。任何写入操作都会被拒绝。
db_execute执行修改数据或结构的语句。它会先请求你的批准,除非聊天处于 完全访问 且 在本机之外操作前先询问 已关闭。
  • 这些工具作用于你最后打开的连接;如果没有其他配置,则作用于本地引擎。模型也可以指定列表中的其他连接。
  • 在云数据库上,聊天会遵守控制台的 只读 开关,不会执行破坏性写入:它会把 SQL 交给你,由你在 SQL 控制台中运行。
  • 发送给模型的查询结果是真实的行(SQL 最多 200 行)。脱敏规则不适用于聊天。第六个只读工具 db_inspect 会读取策略、结构健康状况和已保存的 SQL:见「数据库工具」。

免费版与 Pro

本页的所有内容在免费版中都可使用,但有以下限制(Pro 会取消这些限制):

限制免费版Pro
你自己保存的连接1(本地引擎、服务商账号和通过 在 Database 中打开 得到的内存中的连接不计入;通过分享里的 打开… 或 粘贴 添加的连接,以及已打开的 PlanetScale 分支会计入)不限
已保存的查询5不限
控制台标签页2不限
本地引擎中的数据库1 (postgres)不限
每个连接的表数4(任何引擎;创建、导入或执行 CREATE TABLE 都会计入)不限
对比结构(SCHEMA_DIFF)弹出 Pro 提示已包含
计划备份(SCHEDULED_BACKUP)弹出 Pro 提示。创建、恢复、导出和导入备份是免费的。已包含
无论你碰到哪一项限制,弹出的都是同一个提示,标题为 数据库 Pro。它写着“解锁更多数据库、表和已保存查询、架构对比以及定时备份。”,列出 更多数据库、表和已保存查询、架构比较(Schema Diff) 和 自动计划备份,并有 继续使用基础版(关闭它)和 解锁 DB Pro(打开付费页面)。仪表板是免费的:没有任何限制。

其余功能没有套餐限制:SSH 隧道、所有导入和导出格式、ER 图、执行计划(包括 真实执行分析)、AI 功能、写入你的云数据库、手动备份和恢复、引擎屏幕、监控、安全、审计和仪表板。

价格和完整的 Free / Pro 对照表见 套餐与价格。

键盘快捷键

仅在平板横屏、连接物理键盘、位于控制台内时可用:

按键操作
Ctrl+Enter运行
Ctrl+Shift+Enter运行选中内容
Ctrl+T / Ctrl+W新建标签页 / 关闭标签页
Ctrl+S保存查询
Ctrl+/注释或取消注释选中的行

隐私与安全

  • 没有 PocketCode 服务器:数据从应用直接发往本地引擎、你的主机(或其 SSH 跳板机)或服务商的 API。有两个细节:mongodb+srv:// 的集群名通过 DNS over HTTPS 向 dns.google 解析(之后是 cloudflare-dns.com),而 AI 功能会调用你选择的服务商。你的数据不会经过 PocketCode 服务器。只有在云同步已开启并勾选 连接(SSH/DB) 时,你的连接元数据(名称、主机、端口、引擎和分组;绝不含用户名、密码或 TLS)才会发送到你的 PocketCode 账户。
  • 数据存放在哪里:连接、已保存的查询和文件夹、历史记录(500 条)、审计日志(1,000 条)、控制台标签页、已保存的视图、结构快照、SSH 主机指纹和收藏,都是应用私有存储中的 JSON 文件,每个账号一套。结构项目是同一私有存储中的单独文件。
  • 密码 存放在 Android 的加密存储中,按账号区分。连接文件只保存主机、端口、数据库和用户,从不保存密码。应用关闭了 Android 云备份。
  • 本地引擎 只接受来自手机本机的 TCP 连接,并且始终要求密码(SCRAM-SHA-256)。它的密码是随机生成并加密存储的;没有密码引擎拒绝启动。Unix 套接字位于应用的私有目录内。
  • AI:在你接受授权对话框之前,不会向任何服务商发送任何内容。SQL 助手发送方言以及你的表名和列名(不含行数据);执行计划解释发送查询及其计划;聊天工具发送它们读取的行。
  • 分析统计(启用时):模块会上报引擎类型、查询耗时和返回的行数、导出格式和行数,以及错误类别。从不上报 SQL、名称或值。
  • 脱敏 和 生物识别锁 在「数据库工具」中介绍。

限制

哪些功能不可用以及原因,免得你措手不及:

  • 本地引擎需要 64 位 ARM 手机。 x86 构建(模拟器、x86 Chromebook)不包含它。设备
  • 本地 MariaDB 未包含:代码存在,但没有随附 MariaDB 软件包,所以从不提供。尚未提供
  • 引擎不会在后台保持运行;Android 可能会停止它,而计划备份是系统可以推迟的 WorkManager 任务。Google Play
  • 应用中没有 psql 或 pg_isready(它们的 readline 库是 GPL-3)。有意为之
  • 脚本:控制台一次发送编辑器中的全部内容,且每次运行使用独立的连接,因此一次运行中的 BEGIN 和下一次运行中的 COMMIT 不构成一个事务。有意为之
  • 网格编辑 逐条语句应用。如果某条失败,之前的语句仍保持已应用状态。有意为之
  • MySQL / MariaDB:没有索引、外键或触发器列表,行数为估算值,支持 mysql_native_password 和 caching_sha2_password 认证(后者的完整路径仅限 TLS),不支持 ed25519,也从不使用 LOAD DATA LOCAL INFILE。有意为之
  • SSH 隧道:只支持本地端口转发,只适用于 PostgreSQL 和 MySQL / MariaDB,没有 agent,不支持链式跳转,不支持带口令的密钥。有意为之
  • SSH 开关出现在每种类型的表单上,但在 PostgreSQL 和 MySQL / MariaDB 之外什么都不做。尚未提供
  • Neon:通过账号运行的 SQL 适用于使用默认 neondb 数据库和 neondb_owner 角色的项目。第三方
  • Supabase:它的 API 不提供数据库密码,所以真正的 PostgreSQL 连接需要 使用直接连接,并输入一次密码。第三方
  • 服务商账号 需要网络,并且服务已在 设置 → 集成 → 已连接的服务(或通过 Backend Manager)中连接。mongodb+srv:// 主机还需要 DNS over HTTPS。需要网络
  • ER 图、控制台和执行计划 在 MongoDB、Redis、Upstash 或 Firestore 上不存在。有意为之
  • 实测计划(真实执行分析)仅限 PostgreSQL 方言;MySQL 的计划是估算值,SQLite 的计划没有代价。有意为之
  • 备份 只覆盖本地 PostgreSQL。你的服务器和云数据库的备份由它们的服务商保管。有意为之
  • 安全模式没有开关:它始终开启。有意为之
  • 筛选运算符:BETWEEN 只有一个值输入框。尚未提供
  • 表列表 ⋮ 菜单中的 搜索对象 目前还不显示结果。尚未提供
  • 结构树 画出了 Functions、Sequences、Enums 和 Dependencies 分区,但它们始终为空。尚未提供
  • Use in project:即使开启了生物识别锁,显示 和 复制 URL 也不会要求指纹。尚未提供
  • 有些文字在所有语言中都是英文:引擎卡片上的 Running / Stopped,以及首次运行的步骤(“Preparing…”、“Extracting…”、“Setting up…”、“Installing database…”、“Verifying…”、“Ready”)。尚未提供

常见问题

标题就是应用显示的提示信息。

「此版本未为你的设备包含 PostgreSQL。」

手机不是 64 位 ARM,本地引擎无法运行。模块中的其他功能都能正常使用。

「引擎已停止」和「启动本地 PostgreSQL 引擎以使用其中的表。」

引擎处于关闭状态。点击该屏幕上或起始屏幕中引擎卡片上的 启动。

回到应用后,引擎卡片显示 Stopped

Android 在后台停止了应用。点击 启动;如果 PostgreSQL 当时正在写入,它会自行恢复。开启 持久性 时,最坏情况下最后几毫秒内已提交的事务可能丢失。

在终端中 echo $DATABASE_URL 没有输出

先启动引擎,再打开一个新的终端会话。引擎启动之前打开的会话看不到这些变量,SSH 会话则永远看不到。

「本地引擎已停止,没有可提供的连接。启动后再回来。」

在项目中使用 需要引擎正在运行。先启动它,再重新打开面板。

「… 暂时无法从应用内测试(缺少驱动)。」

测试连接 没有针对 Turso、Upstash、Atlas 和 Cloudflare D1 的测试。请直接打开该账号:如果连接有误,你会在那里看到。

「SSH 服务器的密钥已更改。连接已中止…」

跳板机的指纹与第一次保存的不同。如果你重装了服务器,这是正常的;否则可能有人在中间,所以不要继续。

通过 TLS 连接 PostgreSQL 服务器时 测试连接 失败

验证服务器 会对照你手机信任的证书颁发机构检查证书。如果你的服务器使用自己的证书,请用 选择 CA 证书… 选择它的 CA。使用 仅加密(不验证) 时,连接会加密但不检查证书,屏幕会对你发出警告。

「已应用 %1$d / %2$d:…」

排队的某个编辑失败了。它之前的编辑仍保持已应用(没有事务)。阅读错误信息,修复后再次应用其余的。

「该表已有 N 行。NOT NULL 列需要默认值…」

在你给 NOT NULL 列设置 默认值 之前,添加列 会一直被禁用:已有的行需要有东西可以存放。

“No se pudieron aplicar los cambios: la tabla no tiene clave primaria utilizable…”

这条消息始终是西班牙语。它的意思是这张表没有可用的主键(或某一行的主键被设为 NULL),所以应用无法安全地识别行,什么都不会应用。

「“只读”已开启,因此未发送此写入。请在编辑器上方关闭“只读”后再运行。」

你正在使用 Neon、Supabase、Turso 或 D1 数据库。在编辑器上方关闭 只读,然后再次运行;它会要求你确认,对于破坏性写入还会要求指纹。

我信任的查询也弹出了 危险操作

安全模式检查的是文本,而不是你的意图。阅读对话框中的 SQL,然后点击 仍要执行。

「未连接任何 AI 提供商。请在 AI 设置中连接一个,由模型来编写查询。」

建议显示 离线 — 由规则生成,非模型。请在 AI 设置中连接一个提供商(或为 SQL 助手 选择一个模型),然后点击 重新生成。

「模型未返回 SQL」

模型回答的是不是 SQL 的文字,所以没有 接受。阅读它的回答,换一个模型或改写需求,然后点击 重新生成。

「请先写一条查询 —— 执行计划说明的是它会怎么跑。」

执行计划 需要控制台编辑器中有一条查询。先写一条,再打开计划或点击 解释。

「pg_stat_statements 未启用,没有可显示的统计数据。」

在引擎的 设置 中打开 语句统计 并保存(会重启引擎),然后在 健康 中点击 启用。

“<engine> runs on a server, so its backups belong to that provider.”

只有本地 PostgreSQL 能在手机上备份。对于服务器或云数据库,请使用其服务商的备份,或导出它的表。

「“postgres”是引擎的维护数据库,无法删除。」

删除数据库 从不适用于 postgres 或你当前连接的数据库。如果你想删除的是另一个数据库,请先切换到别的数据库。

「已停止等待该查询。服务器可能仍在执行。」

在 Neon、Supabase、Turso 和 D1 上,停止 无法在服务器上取消查询,只是停止等待。如果查询很重,请到服务商那里检查。

添加连接、标签页、表或已保存的查询时出现 数据库 Pro 提示

Free 允许 1 个连接、5 条已保存的查询、2 个控制台标签页、1 个本地数据库,以及每个连接 4 张表。所有这些限制弹出的是同一个提示;打开 PlanetScale 分支,以及分享里的 打开… 或 粘贴(见「数据库工具」),也会停在同一个连接上。Pro 会取消这些限制。