Php 使用PDO在定义的表空间中打开PostgreSQL数据库

Php 使用PDO在定义的表空间中打开PostgreSQL数据库,php,postgresql,pdo,tablespace,Php,Postgresql,Pdo,Tablespace,好的。。。查看了所有关于PostgreSQL和PDO的问答,但没有幸运地回答我的问题。。。同样的问题是通过谷歌找到答案 因此,我把我的疑问放在大师们的脚下 我刚刚开始使用PostgreSQL,来自MySQL的背景。我使用PDO连接到它,使用pgAdminIII管理数据库本身 如何连接到一个已被固定在定义表空间中的表 $db = new PDO("pgsql:host=127.0.0.1;user=pageserver;password=myPassword;dbname=pageserver;"

好的。。。查看了所有关于PostgreSQL和PDO的问答,但没有幸运地回答我的问题。。。同样的问题是通过谷歌找到答案

因此,我把我的疑问放在大师们的脚下

我刚刚开始使用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,并且随着这一点的进一步发展,我将使用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下设置的

我为我的愚蠢道歉,谢谢你看清楚了


标记为正确。

首先:
如何连接到表…
-您不连接到表。您可以连接到数据库。当您连接到数据库时,您可以访问该表

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

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

连接到包含该表的数据库。如果无法连接到数据库,请检查该数据库是否存在,是否连接到了正确的服务器,以及服务器是否使用了正确的数据库群集

当连接到数据库时,您可以从该数据库的任何表中选择数据。如果需要从数据库的schema中的表中选择数据,请使用表的全名--“schema\u name.table\u name”

如果不希望每次都指定表的全名,可以修改
search\u path
变量以设置默认模式

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

postgre数据库的一般结构

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

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

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

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

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


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

有点离题,但。。。你真的把try..catch算作某种错误抑制措施吗?Postgres是否有自己选择数据库和表空间的原生方式,比如“使用数据库”?您是否试图从DSN中省略dbname,然后手动选择它?@CommonSense否,不是错误抑制,而是错误处理。我用它来处理一些不太出乎意料的事情,并用它把它传递到任何需要正确处理的地方。在本例中,它将用于进一步确定连接数据库失败是否是连接问题。例如,为什么不能使用您已有的连接问题?@commonsense 2我不知道,但如上所述,我是PostgreSQL新手。我一直在搜索“postgresql连接字符串”之类的东西,试图找到如何选择特定的表空间,但到目前为止,还没有找到。这是一个要求的“功能”。客户端认为,备份和在不同服务器上重新安装应用程序会更简单,也不容易出错,因为数据库与站点的其余部分一起保存在指定的文件夹中。就我个人而言,我宁愿和我认识的魔鬼一起潜入。。。但是客户总是对的。好吧。。。也许我说错了。编辑问题并澄清,因为将方案添加到表名没有帮助。@Steve添加了关于postgres数据库群集结构的解释。抱歉,花了我一段时间,在重写时运行了一些测试代码以确保