在基于多个连接创建多个数据库以进行功能测试时,我遇到了一个问题。
我在Symfony 3.3应用程序上创建了一些限制,并且将安排对Symfony维护版本的更新。要记住的是我必须处理现有的PostgreSQL数据库,尤其是3个数据库:
我不喜欢从现有数据库设计我的应用程序。通常当我从头开始创建应用程序时,我首先设计我的应用程序和所有业务规则,但我在这里别无选择。听起来不错,但我的应用程序的这部分是从现有数据库设计的。无论如何,任何建议都是最受欢迎的。因此,在App \ Entity文件夹中,我为3个连接配置了映射:
使用flex,doctrine.yaml文件中的doctrine配置如下所示:
doctrine:
dbal:
default_connection: a
connections:
a:
driver: '%database_a_driver%'
url: '%env(DATABASE_A_URL)%'
charset: UTF8
server_version: '%server_version%'
b:
driver: '%database_b_driver%'
url: '%env(DATABASE_B_URL)%'
charset: UTF8
server_version: '%server_version%'
c:
driver: '%database_c_driver%'
url: '%env(DATABASE_C_URL)%'
charset: UTF8
server_version: '%server_version%'
orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: em_a
entity_managers:
em_a:
connection: a
mappings:
AppDba:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Dba'
prefix: 'App\Entity'
alias: AppDba
em_b:
connection: b
AppDbb:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Dbb'
prefix: 'App\Entity'
alias: AppDbb
em_c:
connection: c
AppDbc:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Dbc'
prefix: 'App\Entity'
alias: AppDbc
现在问题来了。
当我运行此命令时:
bin / console doctrine:database:create --connection = a
使用正确的名称创建相应的数据库,并且还会创建为空的默认公共模式。这是正常的,因为我还没有执行doctrine:schema:create --em=em_a
命令。
但是也有一个模式,其中还创建了一些表。并且此架构不属于数据库,但它属于b数据库。奇怪的是,在我的应用程序中的任何映射中都没有配置这个意外模式中的那些表。它们仅存在于现有数据库中。
有谁知道这个问题的起源以及如何解决它?
其他信息:
所以感谢DonCallisto和iiirxs,我解决了这个问题。我输入正确的前缀,我也使用url设置键进行dbal连接。如果它对我的问题有帮助,我不会。
所以在这里配置:
doctrine:
dbal:
default_connection: a
connections:
a:
driver: '%database_a_driver%'
url: '%env(DATABASE_A_URL)%'
charset: UTF8
server_version: '%server_version%'
b:
driver: '%database_b_driver%'
url: '%env(DATABASE_B_URL)%'
charset: UTF8
server_version: '%server_version%'
c:
driver: '%database_c_driver%'
url: '%env(DATABASE_C_URL)%'
charset: UTF8
server_version: '%server_version%'
orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: em_a
entity_managers:
em_a:
connection: a
mappings:
AppDba:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Dba'
prefix: 'App\Entity\Dba'
alias: AppDba
em_b:
connection: b
AppDbb:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Dbb'
prefix: 'App\Entity\Dbb'
alias: AppDbb
em_c:
connection: c
AppDbc:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Dbc'
prefix: 'App\Entity\Dbc'
alias: AppDbc
此外,可能与托管Postgres数据库的docker容器的某些同步问题有关,我删除了容器,然后我再次创建它。所以现在我没有任何未在我的映射配置中配置的意外架构和表。
最后一点,当使用bin/console doctrine:database:create --env=test --connection=a
时,预期的结果是应该在没有任何模式和表的情况下创建数据库。然后在运行bin/console doctrine:create:schema --em=em_a --env=test
时,它应该从映射和配置中创建所有模式和表。
但Postgres数据库必须始终具有默认公共。因此,在使用doctrine创建数据库时,将创建此架构。没有任何桌子它会是空的,但它会在那里。我想这是与postgres驱动程序相关的特定行为。因此,在使用doctrine创建模式和表之前,必须手动删除此公共模式,否则,它将触发此错误:
Schema-Tool因错误而失败'执行'CREATE SCHEMA public'时发生异常: SQLSTATE [42P06]:重复模式:7错误:执行DDL时模式“public”已经存在:CREATE SCHEMA public
也许有一个设置允许自动执行此操作,但我不知道。任何建议都是受欢迎的。