Files
openidea/docs/zh/guide/database.mdx
T
Mr0Bread 7d146ef1b7 feat(database): reuse a console's result tabs on each run, pin tabs to keep them (#3113)
Running a console added a new Result N tab per run. As in IntelliJ, a run now replaces that console's unpinned result tabs (in place of the first of them); a run without result sets keeps them and shows Output. Pin Tab (tab menu or the result toolbar) keeps a result: its close button becomes Unpin and close gestures spare it; Close All but Pinned closes the rest. Explain Plan replaces only an unpinned plan tab, and the 12-tab limit never evicts pinned or just-created tabs. The shared Tabs component gets an opt-in pinned item flag.

Co-authored-by: Mr0Bread <55754540+Mr0Bread@users.noreply.github.com>
2026-11-13 17:37:59 +08:00

198 lines
17 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "数据库"
description: "连接 SQL 数据库、浏览架构、在查询控制台中执行查询,以及查看、编辑、导入和导出数据。"
---
**数据库** 工具窗口可以连接 SQLite、PostgreSQL、MySQL/MariaDB、Microsoft SQL Server、Oracle、ClickHouse 和 Snowflake,以及兼容这些协议的数据库。驱动内置在 IDE 中,不需要下载 JDBC 驱动。
通过 **工具 › 数据库** 或 **视图 › 工具窗口 › 数据库** 打开。**工具** 菜单中还有 **新建数据源…** 和 **Open Query Console**(打开查询控制台)。
## 支持的数据库
**新建 › 数据源** 中提供以下预设:
| 引擎 | 预设 |
| ---------- | -------------------------------------------------------------------------------------------- |
| PostgreSQL | PostgreSQL、Amazon Redshift、CockroachDB、Greenplum、Neon、Supabase、TimescaleDB、YugabyteDB |
| MySQL | MySQL、MariaDB、Amazon Aurora MySQL、OceanBase (MySQL mode)、SingleStore、StarRocks、TiDB |
| SQL Server | Microsoft SQL Server |
| Oracle | Oracle 19 及以上(内置 thin 驱动,无需客户端库) |
| ClickHouse | ClickHouse(通过 HTTP) |
| Snowflake | Snowflake(通过 HTTPS,见下文) |
| SQLite | SQLite |
预设会填好默认端口,必要时还会设置 SSL(例如 Redshift、Neon 和 Supabase 要求 SSL)。
## 添加数据源
在数据库工具窗口中点击 **+**(或在窗口内按 `⌘N` / `Alt+Insert`),然后选择:
- **数据源 ›** 上表中的某个预设。
- **从文件创建数据源…**:打开一个 SQLite 文件。
- **从 URL 创建数据源…**:粘贴 `postgresql://user@localhost:5432/db` 这样的 URL。也接受 `mysql://`、`mariadb://`、`sqlserver://`、`oracle://`、`clickhouse://`、`sqlite:path` 以及 `jdbc:` 开头的 URL。
- **从剪贴板导入**:从剪贴板读取连接 URL。
数据源对话框顶部有名称、可选的 **颜色:**(给树节点和控制台标签上色)、**全局**(在所有项目中可用)和注释,下面是这些标签页:
<AccordionGroup>
<Accordion title="常规">
**驱动程序:**、**主机:**、**端口:**、**用户:**、**密码:**(可勾选 **保存密码**)、**数据库:** 和 **URL:**。修改 URL 会同步填写上面的字段,反之亦然。把 **连接类型:** 设为 **仅 URL** 时只用 URL 连接。SQLite 改为 **文件:** 字段,文件必须已存在。
**测试连接** 会显示服务器版本或错误信息。
</Accordion>
<Accordion title="选项">
- **只读**:在数据库支持时于会话级别禁止写入(PostgreSQL、MySQL、SQLite、Oracle、ClickHouse),同时禁用表格编辑。
- **事务控制:** **自动** 或 **手动**(ClickHouse 只能自动)。
- **默认架构:**(PostgreSQL 的 `search_path`)或 **当前模式:**(Oracle)。
- **时区:**、保持活动查询的间隔,以及空闲多少秒后 **自动断开连接**。
- **单数据库模式**(PostgreSQL):只显示配置的数据库。
- **启动脚本:**:每次新建连接时执行。
</Accordion>
<Accordion title="SSH/SSL">
**使用 SSH 隧道**:选择已保存的 SSH 配置,或自定义字段(主机或 `~/.ssh/config` 别名、端口、用户,以及 **OpenSSH 配置和身份验证代理**、**密码** 或 **密钥对** 认证)。
SSL **模式:** 可选 **禁用**、**首选**、**必需**、**验证 CA**、**完全验证**,并可指定 **CA 文件:**、**客户端证书文件:** 和 **客户端密钥文件:**。SQLite 没有这个标签页。
</Accordion>
<Accordion title="架构">
选择树中显示哪些数据库(PostgreSQL)和架构:全部、勾选的列表,或使用 `*` 和 `?` 的名称模式。**从服务器加载名称** 会获取列表。**对象筛选:** 按名称过滤表、视图、例程和序列。**显示内部系统架构** 和 **显示模板数据库**(PostgreSQL)默认关闭。
</Accordion>
<Accordion title="高级">
以名称/值形式设置驱动属性,例如 `statement_timeout`(PostgreSQL)、`sql_mode`(MySQL,作为会话变量设置)、`journal_mode`(SQLite pragma)、`NLS_DATE_FORMAT`(Oracle)、`max_threads`(ClickHouse)。所有驱动都支持 `connect_timeout`(秒)。
</Accordion>
</AccordionGroup>
### 配置和密码保存在哪里
- 项目数据源:项目中的 `.openidea/data-sources.toml`。
- 全局数据源:IDE 数据目录下的 `data-sources.toml`(见 [数据目录](/zh/reference/data-directories))。
- 项目打开时,可以手动或让编码代理编辑这些文件:数据库工具窗口会自动读取改动,设置被修改或被删除的数据源的连接会被关闭。
- 密码从不写入这些文件。保存的密码放在操作系统凭据存储中(钥匙串、Windows 凭据管理器或 Secret Service);未保存的密码只在本次会话的内存中,连接时会询问。
## 浏览数据库
树的结构为 数据源 › 数据库(PostgreSQL)› 架构 › `tables`、`views`、`materialized views`、`routines`、`sequences`。表下面有 `columns`、`keys`、`foreign keys`、`indexes` 和 `triggers`。节点在展开时才加载。在工具窗口的选项菜单中打开 **分别显示过程和函数** 可以把 `routines` 拆开。
双击表会编辑其数据,双击数据源会打开它的控制台,双击例程、序列或触发器会显示 DDL。在 **过滤对象** 中输入文字可以过滤树。
| 操作 | macOS | Windows/Linux |
| ------------------------------- | ---------------- | ------------------ |
| 新建…(数据源、控制台、表、列) | `⌘N` | `Alt+Insert` |
| 数据源属性… | `⇧Enter` | `Shift+Enter` |
| 刷新 | `⌘R` | `Ctrl+F5` |
| 停用(断开连接) | `⌘F2` | `Ctrl+F2` |
| 编辑数据 | `F4` | `F4` |
| 转到 DDL | `⌘B` | `Ctrl+B` |
| 快速文档 | `F1` | `Ctrl+Q` |
| 跳转到查询控制台… | `⌘⇧F10` | `Ctrl+Shift+F10` |
| 重命名… | `⇧F6` | `Shift+F6` |
| 修改表… | `⌘F6` | `Ctrl+F6` |
| 删除… | `Delete` 或 `⌘⌫` | `Delete` |
| 复制引用 | `⌘⌥⇧C` | `Ctrl+Alt+Shift+C` |
| 复制(数据源) | `⌘D` | `Ctrl+D` |
| 生成 DDL 到剪贴板 | `⌘⌥⇧G` | `Ctrl+Alt+Shift+G` |
| 生成 DDL 到查询控制台 | `⌘⌥⇧B` | `Ctrl+Alt+Shift+B` |
这些快捷键在数据库树获得焦点时生效。右键菜单中还有 **截断…**、**运行 SQL 脚本…**(执行某个 `.sql` 文件中的所有语句)、**从文件导入数据…**、**转到引用的表**(外键上)、SQL 模板(select、insert、update、delete)以及 **移除数据源…**。
**修改表…** 和 **新建 › 表** 会打开一个对话框,可以添加、删除或修改列(名称、数据类型、非空、主键、默认值),并实时预览 SQL。SQLite 只能重命名或删除已有列。ClickHouse 表不能用这种方式修改。
## 查询控制台
每个数据源都有一个查询控制台,它是保存在 IDE 数据目录中的 `.sql` 文件。可以用 **查询控制台**(`⌘⇧L` / `Ctrl+Shift+Q`)、从树中或通过 **工具 › Open Query Console** 打开。项目中任何可写的 `.sql` 文件也有同样的工具栏,绑定数据源后即可执行。
控制台工具栏:
- **执行**(`⌘Enter` / `Ctrl+Enter`):执行选中的语句,没有选区时执行光标处的语句。
- **解释计划**:在 **Query Plan** 标签页中显示执行计划。
- **取消正在运行的语句**。在手动事务中取消会回滚该事务。
- **浏览查询历史记录**:每个数据源最近 500 条语句,可搜索并粘贴回控制台。
- 行数上限(100 到 50,000,默认 500)。
- **事务:自动** / **事务:手动**。手动模式下会出现 **提交** 和 **回滚**。
- 架构选择器(PostgreSQL、MySQL、SQL Server、Oracle、Snowflake)和数据源选择器。Snowflake 控制台还提供仓库和角色选择器。
语句按 `;` 拆分,会正确处理字符串、注释和 PostgreSQL 的美元引号。Oracle 的 PL/SQL 块保持完整,只有 `/` 的一行表示语句结束。`:id`、`?`、`$1`、`@name` 等参数会弹出 **参数** 对话框;值按 SQL 文本插入,字符串需要自己加引号。
SQL 补全基于已连接的架构:`FROM`/`JOIN` 后补全表(并根据外键给出连接条件)、补全作用域内的列,以及各方言的关键字和函数。无法解析的表和列会被标出,控制台中可以使用转到声明、快速文档和重新格式化代码。一般 SQL 文件的支持见 [SQL](/zh/languages/sql)。
## 结果与数据编辑
结果显示在 **服务** 工具窗口的 **数据库** 标签页中:**输出** 标签页记录每条语句,每个结果集一个 **Result N** 标签页(最多 12 个,已固定的标签页除外)。
再次运行控制台会替换它之前的结果:它未固定的结果标签页会让位给新的运行,新运行每个结果集一个标签页(**Result N**;选中的多条语句都返回行时为 **Result N**、**Result N-2**……)。没有结果集的运行(如 `UPDATE`)会保留之前的结果。其他控制台的结果不受影响。
要保留某个结果,可在结果标签页的右键菜单中选择 **固定标签页**,或点击结果工具栏上的固定按钮;标签页的关闭按钮会变成固定按钮,点击即可取消固定,误点或中键点击都不会关闭它;之后的运行会改为打开新标签页。重新运行或翻页已固定的结果时,会在原标签页中更新。
<Warning>
替换结果会丢弃其中尚未提交的更改。再次运行控制台前,请先 **提交** 或 **还原** 这些更改,或固定该标签页。
</Warning>
右键点击结果标签页(或聚焦后按 `Shift+F10`),可使用 **关闭**、**关闭其他**、**全部关闭**、**关闭除已固定外的所有标签页**、**固定标签页** / **取消固定标签页**、**重命名标签页**、**选择下一个标签页** 和 **选择上一个标签页**。这些操作只作用于结果标签页,**输出** 始终保留。重命名的标题在结果关闭或被替换前一直有效。
焦点位于结果标签页或结果内容中时,IntelliJ macOS 快捷键方案使用 `⇧⌘]` / `⇧⌘[`(也支持 `⌃→` / `⌃←`),IntelliJ Windows/Linux 使用 `Alt+→` / `Alt+←`。VS Code 和 Eclipse 方案分别使用各自默认的编辑器标签页导航快捷键。切换后焦点移到目标结果标签页。结果导航快捷键仅在结果区域中生效,菜单或对话框打开时不会切换结果。可在 **设置 › 快捷键** 中单独修改数据库结果快捷键,不影响编辑器快捷键。
关闭当前选中的结果标签页时,优先选中左侧相邻的结果;没有左侧结果时,选中右侧相邻结果。没有剩余结果时,选中 **输出**。关闭未选中的结果不会改变当前选择。
- **表** 或 **图表** 视图(柱状图或折线图,可选 X/Y 列和聚合方式)。
- 分页,每页 10 到 1,000 行;点击行数可以统计总行数。
- **在结果中搜索**,以及按列对已加载行进行本地筛选。
- 侧边面板:**记录**、**值** 和 **聚合**(计数、去重计数、空值数、求和、平均值、中位数、最小值、最大值)。
- JSON 值使用 JSON 编辑器,支持 **重新格式化** 和 **在窗口中打开**。
### 编辑数据
**编辑数据**(`F4`)在编辑器标签页中打开表,服务器端分页(每页 100 到 5,000 行),并提供 `WHERE` 过滤和 `ORDER BY` 字段(都支持补全)。点击列标题排序,按住 `Shift` 点击可以追加排序列。
- 双击、`Enter` 或 `F2` 编辑单元格;`Shift+Enter` 打开更大的编辑框。粘贴制表符分隔的文本可以一次填写多个单元格。
- **添加行**、**删除行**、**设为 NULL**(`⌘⌫` / `Ctrl+Backspace`)、**设为默认值**(`⌘⇧⌫` / `Ctrl+Shift+Backspace`)。`Space` 切换布尔值。
- **提交**(`⌘Enter` / `Ctrl+Enter`)在一个事务中提交所有待定更改;**还原**(`⌘⌥Z` / `Ctrl+Alt+Z`)放弃更改。
如果控制台查询是对单表的简单 select 且包含主键,结果同样可以编辑。没有主键的表、连接查询、聚合、`UNION` 查询、只读数据源和 ClickHouse 的结果都是只读的。
## 导出与导入
导出按钮提供 **导出数据…** 以及快速复制:**Copy as CSV**、**Copy as TSV**、**Copy as JSON**、**Copy as SQL Inserts**、**Copy as Markdown** 和 **Copy as One-Row**。**导出数据** 对话框还支持 **转置**、列标题和行标题、预览、**复制到剪贴板** 和 **导出到文件**。导出范围是已加载的行(当前页)。
**从文件导入数据…** 把 CSV、TSV 或 TXT 导入到表中:自动识别分隔符,第一行可作为标题并按名称匹配列,空值可以视为 `NULL`。导入在一个事务中完成。ClickHouse 不支持导入。
## Oracle
Oracle 连接使用内置的纯 Rust thin 驱动,不需要 Oracle 客户端库或 `ORACLE_HOME`。支持 Oracle Database 19 及以上版本。
在 **常规** 中填写主机、端口(1521),并在 **数据库:** 中填写服务名(例如 `ORCLPDB1`)。也可以在这里填写完整的 TNS 描述符,或从 `tnsnames.ora`(`TNS_ADMIN` 或 `$ORACLE_HOME/network/admin`)解析的 TNS 别名。也支持 `oracle://scott@db.example.com:1521/ORCLPDB1`、`jdbc:oracle:thin:@//db.example.com:1521/ORCLPDB1` 这样的 URL。
如果密码正确但登录报 `ORA-01017`,可能是该账号只有旧的 10G 密码校验值;把密码重新设置为同一个值(`ALTER USER … IDENTIFIED BY …`)即可生成新的校验值。
树中在表、视图、例程和序列旁边显示包(其 DDL 为包规范和包体)。
Oracle 的架构就是数据库用户;系统账户只在勾选 **显示内部系统架构** 后显示。
## Snowflake
选择 **数据源 › Snowflake** 并填写:
- **账户:** 账户标识符(`myorg-myaccount` 或 `xy12345.eu-central-1`),或账户主机名。
- **用户**,以及可选的 **数据库**、**模式**、**仓库** 和 **角色**(留空则使用用户的默认值)。
- **身份验证:**
- **密钥对** — RSA 私钥文件(PKCS#8 `.p8`,加密或未加密,或 PKCS#1)及其密码短语。只保存路径,每次登录时读取密钥。
- **单点登录(网页浏览器)** — 在默认浏览器中打开身份提供方页面。远程项目中不可用。
- **密码**、**编程访问令牌** 或 **OAuth 令牌**。
勾选 **保存密码** 时,密码短语、密码或令牌保存在操作系统的凭据存储中,不会写入数据源文件。在 **URL** 字段中输入 JDBC URL(`jdbc:snowflake://…?warehouse=…&db=…&role=…`)会填充各项设置。
树中依次显示数据库、架构及其表、视图、例程、序列、暂存区、流、任务、管道和文件格式。这些信息通过 `SHOW` 命令读取,不需要运行中的仓库,只列出当前角色可见的对象。一个数据源的所有数据库共用一次登录;控制台和树使用各自的会话,长时间查询不会阻塞浏览。
**高级** 属性是会话参数(例如 `QUERY_TAG`、`STATEMENT_TIMEOUT_IN_SECONDS`)。
限制:`TIMESTAMP_LTZ` 值以 UTC 显示;不提供 SSH 隧道;结果以 JSON 读取。
## 暂不支持
- MongoDB、Redis、BigQuery 等未列出的数据库,以及 JDBC 驱动。
- SQL Server 的 `GO` 批处理分隔符。
- “执行整个控制台”的操作(请选中后执行,或使用 **运行 SQL 脚本…**)。
- 导出超出已加载页面的数据。
- 表格中的日期选择器和外键查找。
- SQL Server 的会话级只读模式(只会禁止表格编辑)。