0

好的...查看了有关 PostgreSQL 和 PDO 的所有问答,但没有运气回答我的问题...通过 Google 找到答案的同样问题。

因此,我将我的问题放在大师们的脚下。

我刚开始使用 PostgreSQL,来自 MySQL 背景。我正在使用 PDO 连接到它,并使用 pgAdminIII 来管理数据库本身。

如何连接到已卡在已定义表空间中的表?

$db = new PDO("pgsql:host=127.0.0.1;user=pageserver;password=myPassword;dbname=pageserver;");

导致:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08006] [7] FATAL: database "pageserver" does not exist' in ~stacktrace~

在任何人提到之前,当然,我应该使用 try/catch,我会随着这进一步发展......但现在这个错误是有帮助的。

这个数据库确实存在,但是我在这个项目中使用的所有数据库都放在一个表空间中,以将数据库保存在特定的子文件夹中。

我假设这是我的问题所在;到目前为止,我在 PDO 文档中没有看到任何关于表空间的引用。

PostgreSQL 的文档显然对表空间有很长的篇幅,但没有参考 PDO 语法来连接它们。

我希望它很简单,例如:

$db = new PDO("pgsql:host=127.0.0.1;tablespace=system;user=pageserver;password=MyPassword;dbname=pageserver;");

但这会导致:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08006] [7] invalid connection option "tablespace"' in ~stacktrace~

@伊戈尔

好吧,我只花了大约半个小时进行进一步的测试,探索结构,并确保角色、模式、表空间和表都符合要求……

它们都井井有条,并且实际上设置正确。

我尝试按照您的建议使用 schema.database 名称,但是没有用。

然后我发现了一直困扰我的问题。

显然,在建立数据库之后,将近 40 个表,包括所有索引……我的问题甚至不是 PostgreSQL。

这是 PgAdminIII 和我完全缺乏睡眠的邪恶组合。

显然,所有这些表都是在 db 'postgres' 下设置的,而不是在它们应该放置在其中的 db 下。

我为我的白痴道歉,并感谢你看清了它。

标记为正确。

4

1 回答 1

2

首先:How do I connect to a table ...- 您没有连接到表。您连接到数据库。当您连接到数据库时,您可以访问该表。

其次 - 表空间不会以任何方式影响对 DB 表的访问。表空间仅用于组织表的物理存储。您可能将表空间误认为是 schems。模式用于数据库内表的逻辑组织。

因此,要从 postgres 中的表中获取数据,您需要:

连接到具有该表的数据库。如果您无法连接到数据库,请检查它是否存在,您正在连接到正确的服务器并且服务器正在使用正确的数据库集群。

当连接到数据库时,您可以从该数据库的任何表中选择数据。如果您需要从数据库的特定模式中的表中选择数据-使用表的全名-'schema_name.table_name'。

如果您不想每次都指定表的全名 - 您可以修改search_path变量以设置默认模式。

对于第二个问题 - 对于批量数据加载,您可以通过COPY命令使用 csv 导入。对于测试数据的生成——有很多工具,包括付费的和开源的。你只需要搜索(或支付)他们。

postgre 数据库的一般结构。

首先 - 有一个数据库集群。它是一个文件夹,包含配置文件、日志、默认表空间和有关此集群中数据库的主要信息。

当你启动一个 postgres 服务器时,你必须指定一个它将使用的数据库集群。

接下来是数据库。当您连接到 postgres 服务器时,您必须指定一个数据库,该数据库存在于数据库集群中,服务器正在使用。

接下来是数据库中的模式。默认public架构和任意数量的用户创建的架构。模式仅用于在逻辑上将您的表划分为一些子集。

接下来是桌子。它们属于特定数据库的特定模式。表将数据存储在表空间中。

一个数据库可以使用任意数量的表空间。一个表空间可以被任意数量的数据库使用。表空间仅定义一个文件夹,其中存储了表(使用此表空间)的数据。对表空间的更改不会影响您连接到数据库的方式或从表中选择数据的方式。

于 2013-07-26T19:18:46.663 回答