作为 Postgres 的初学者,我创建了两种不同的数据库安装,其中一个需要使用 select 语句,...FROM database.table...
另一个只需要...FROM table...
. 这是在一个可能指向任一安装的 Symfony 项目中发现的。当指向安装需要时项目失败...FROM database.table...
如何删除包含数据库名称和表名的要求,以及该要求可能来自哪里?
背景:项目从 MySQL 数据库开始。因为我想学习 Postgres,所以我按照网上找到的一些很棒的材料将 MySQL 数据库转换为 Postgres。MySQL 数据位于 Windows 中,Postgres 安装在 Ubuntu 18 VM 上。(转换在 VM 上创建了 Postgres 版本。)VM 的数据库被转储pg_dump
,生成的 sql 文件复制到 Windows 并在那里恢复。所有这些都在 MySQL 8 和 Postgres 12 中。
当 Symfony 项目指向 VM 的数据库时,一切都很好。指向 Windows 副本失败,因为它找不到任何给定的表。
在 VM 上,我可以psql
使用...FROM table...
. 在带有 的 Windows 中psql
,即使SELECT current_database();
返回数据库的名称,我也必须...FROM database.table...
在查询中使用。
那不是数据库,那是模式。(使用“数据库”这个奇怪而令人困惑的名称)。
您可以使用 3 个名称组件来引用事物
databasename.schemaname.tablename
,但这很少这样做,因为第一个组件必须与您连接到的数据库的名称相同。除了作为与其他数据库软件保持兼容性的一种方式之外,这使得它非常无用。在一个数据库中,您的表位于 search_path 中的架构中,而在另一个数据库中则不是。这可能是因为数据库之间的 search_path 不同,或者可能是因为表实际上位于不同命名的模式中。您可以使用
show search_path
来查看每个数据库中有效的 search_path。您应该
search_path
适当地设置:这
database
是您问题中的架构名称。然后重新连接,您不需要使用模式限定表名。
我找到了解决方法,但没有找到必要的原因。
对于项目中的每个实体(Symfony 5.2),添加注释
@ORM\Table(schema="rv")
。这会强制使用特定的模式。好消息是添加的注释不会影响将项目指向 MySQL 数据库/模式。编辑:虽然这不能解释为什么
FROM schema.table
需要,但我现在知道如何使 Windows 实例不需要schema.table
. 我没有运行由pg_dump
我首先删除然后重新创建的 sql 文件rv
,然后使用pgloader
(在 VM 上)将 MySQL 数据库迁移到新的 Postgresrv
数据库。然后该项目在没有@ORM\Table(schema='...")
注释的情况下工作。使用 Symfony 和 Doctrine,如果控制台命令
doctrine:database:create
用于 Postgres 项目,则不会进行任何查询,schema.table
也不需要注释。哇!