Manually created databases are not visible in the Supabase Dashboard
如果你在 Supabase 项目中手动创建了一个额外的数据库,比如 example_database,你可能会发现它可以通过外部数据库工具访问,但在 Supabase 控制面板中看不到。这个指南解释了这种现象的原因,以及 Supabase 是如何设计来处理数据库的。
🌐 If you've manually created an additional database within your Supabase project, such as example_database, you might observe that it's accessible via external database tools but is not visible in the Supabase Dashboard. This guide explains the underlying reasons for this behavior and how Supabase is designed to handle databases.
关键概念 #
🌐 Key concepts
在深入问题之前,先定义一些关键术语:
🌐 Before diving into the problem, define some key terms:
- 什么是 Postgres 集群? 在 Postgres 术语中,“集群”指的是由单个 Postgres 服务器实例管理的一组数据库。这个单独的实例可以托管多个独立的数据库,每个数据库都有自己的一套表、用户和权限。每个 Supabase 项目都是运行在完整的 Postgres 集群之上的。
- 什么是 Supabase 项目? Supabase 项目是一个集成平台,包括专用的 Postgres 数据库、身份验证服务、存储、实时功能等等。每个项目都配置为与其主要数据库无缝交互。
- Supabase 控制面板是什么? Supabase 控制面板是一个基于网页的界面,提供图形化的方式来管理你项目的数据库模式、数据、认证规则、存储桶、函数以及其他 Supabase 服务。
- 什么是 PostgREST? PostgREST 是一个独立的网络服务器,它可以自动将你的 Postgres 数据库直接转换成 RESTful API。它会根据你的数据库结构生成 API 端点,让你通过 HTTP 请求与数据互动,而不需要编写自定义的后端代码。Supabase 利用 PostgREST 来提供强大的 API 层。
理解问题:Supabase 中的多个数据库 #
🌐 Understanding the problem: Multiple databases in Supabase
这种行为的核心源于 Postgres 管理数据库的方式与 Supabase 与它们集成的方式之间的区别。
🌐 The core of this behavior stems from the distinction between how Postgres manages databases and how Supabase integrates with them.
- **Postgres 的灵活性:**作为一个标准的 Postgres 集群,你的 Supabase 后端本身就可以托管多个数据库。你可以连接到你的项目,并手动创建额外的数据库,比如
example_database或another_database,和默认的postgres数据库并列。这些手动创建的数据库都是完全功能的 Postgres 数据库,可以通过 TablePlus、psql或任何其他 Postgres 客户端访问,只要你使用正确的连接参数(例如user=postgres.[your_project_slug] host=... port=... dbname=example_database)。 - Supabase 的集成设计: 虽然 Postgres 本身支持每个集群有多个数据库,但 Supabase 平台、它的仪表板以及大多数集成功能(比如用于 API 的 PostgREST、Supabase Auth 和 Supabase Storage)都是专门设计来只使用项目的 默认
postgres数据库 的。 - 断开连接的解释:
- 仪表板可见性: Supabase 仪表板仅用于管理和显示与你项目中的
postgres数据库相关的信息。因此,手动创建的数据库(如example_database)将不会出现在仪表板界面上,因为仪表板没有配置与它们交互。 - 服务整合: Supabase 的整合服务与
postgres数据库紧密相连。例如,由 PostgREST 提供支持的 API 层是为了公开 来自postgres数据库的模式,而不是管理或公开多个独立的数据库。这种架构选择简化了平台设计,确保行为一致,并允许 Supabase 有效地在postgres数据库之上构建其功能。为所有整合服务支持多数据库会带来显著的复杂性,并从根本上改变 Supabase 目前的模型。
- 仪表板可见性: Supabase 仪表板仅用于管理和显示与你项目中的
解决方案和最佳做法 #
🌐 Resolution and best practices
要有效使用 Supabase 及其功能,可以考虑以下方法:
🌐 To effectively use Supabase and its features, consider the following approaches:
- 关于 Supabase 功能集成: 如果你希望通过 Supabase 仪表板管理数据,或者通过自动生成的 API(PostgREST)访问数据,或者整合 Supabase 的认证或存储服务,那么你所有的数据和表结构 都必须存放在项目的默认
postgres数据库中。这是确保与 Supabase 生态系统完全兼容的指定数据库。 - 当真正需要独立、集成的数据库时: 如果你的应用架构需要一个在逻辑上独立,同时又能充分利用 Supabase 所有功能集成(仪表盘可视化、API、认证等)的数据库,推荐的做法是 创建一个新的 Supabase 项目。每创建一个新项目,你都会得到一个独立的 Postgres 集群和默认的
postgres数据库,并且完全与 Supabase 的所有服务集成。这可以确保每个由 Supabase 管理的“数据库”都有自己的独立环境和完整的功能支持。 - 使用手动创建的数据库(有注意事项): 在单个 Supabase 项目的 Postgres 集群中创建额外的数据库(例如
example_database)在技术上是可行的,并且可以通过外部工具访问。不过,这种方法通常只适合在以下情况下使用:- 你不需要通过 Supabase 控制板查看或管理这些数据库。
- 你不打算在这些特定的数据库上使用 Supabase 的集成服务(比如 PostgREST、认证或存储)。
- 你可以完全通过直接的 Postgres 客户端连接来管理这些数据库,本质上把它们当作 Supabase 提供的集群中的普通 Postgres 数据库来操作,只是脱离了 Supabase 平台的功能范围。