我在基于多个连接创建多个数据库以进行功能测试时遇到了一个问题。
我创建了一个Symfony 3.3应用,由于一些限制,将计划更新到Symfony的维护版本。需要记住的是,我必须处理现有的PostgreSQL数据库,特别是3个数据库:
- 数据库A
- 数据库B
- 数据库C
我不喜欢从现有的数据库设计我的应用程序。通常当我从头开始创建应用程序时,我首先设计我的应用程序和所有业务规则,但我没有选择。听起来很糟糕,但我的应用程序的这一部分是从现有的数据库设计的。无论如何,任何建议都是最受欢迎的。所以,在App\Entity文件夹中,我为3个连接配置了Map:
- 与数据库A相关的实体位于App\Entity\Dba文件夹中
- 与数据库B相关的实体在App\Entity\Dbb文件夹中
- 与数据库C相关的实体位于App\Entity\Dbc文件夹中
使用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原则:数据库:创建--连接=a
相应的数据库用正确的名称创建,默认的公共模式也是空的。这是正常的,因为我还没有执行doctrine:schema:create --em=em_a
命令。
但是还有一个模式,其中也创建了一些表。这个模式不属于a数据库,但属于b数据库。奇怪的是,这个意外模式中的那些表没有在我的应用程序中的任何Map中配置。它们只在现有的数据库中。
有谁知道这个问题的由来以及如何解决?
其他信息:
- Symfony 3.3.18
- PostgreSQL 9.4.17
- 原则2.5.9-稳定
- Doctrine dbal v2.6.3
- 原则包1.9.1
1条答案
按热度按时间rdlzhqv91#
所以感谢DonCallisto和iiirxs我修复了这个问题。我把正确的前缀,我也使用url设置键dbal连接。我不知道它是否对我的问题有帮助。
这里的配置:
字符串
此外,可能与托管Postgres数据库的docker容器的一些同步问题有关,我删除了容器,然后重新创建了它。所以现在我没有任何未在Map配置中配置的意外模式和表。
最后一件事,当使用
bin/console doctrine:database:create --env=test --connection=a
时,预期的结果是创建的数据库应该没有任何模式和表。然后当运行bin/console doctrine:create:schema --em=em_a --env=test
时,它应该根据您的Map和配置创建所有的模式和表。但是Postgres数据库必须始终有一个默认的public。所以在使用doctrine创建数据库的时候,会创建这个schema,它会是空的,没有任何表,但是它会在那里。我猜这是与postgres驱动相关的特定行为。所以在使用doctrine创建schema和表之前,需要手动删除这个publicschema,否则,它将触发此错误:
Schema-Tool失败,错误为“执行”CREATE SCHEMA public“时发生异常:
SQLSTATE[42 P06]:重复的架构:7错误:架构“public”已经存在'当执行SQL:CREATE SCHEMA public时
也许有一个设置,允许这样做自动,但我不知道它。任何建议,欢迎。