Symfony 3.4对接Postgres非public schema的连接配置问题
Symfony 3.4 连接PostgreSQL指定非public schema配置方法
核心原理
Symfony 3.4默认使用Doctrine作为ORM层,PostgreSQL连接默认的schema搜索路径为public,如果业务使用自定义schema,需要手动修改Doctrine的连接配置指定搜索路径。
配置方法
方法1:全局配置连接默认schema(推荐)
修改app/config/config.yml中的Doctrine DBAL配置,在连接初始化时执行search_path设置:
doctrine: dbal: driver: pdo_pgsql host: "%database_host%" port: "%database_port%" dbname: "%database_name%" user: "%database_user%" password: "%database_password%" charset: UTF8 # 追加以下配置指定自定义schema options: 1002: "SET search_path TO 你的自定义schema名称"
其中参数1002对应PDO常量PDO::ATTR_INIT_COMMAND,会在每次数据库连接建立时自动执行设置语句,全局生效无需单独修改实体配置。
方法2:单独为实体指定schema
如果只有部分实体属于自定义schema,可以直接在实体映射中指定:
- 注解映射方式:
/** * @Entity * @Table(schema="你的自定义schema名称") */ class 你的实体类 { // 实体属性与方法定义 }
- YAML映射方式:在对应实体的yaml配置文件中追加schema字段
Your\Bundle\Entity\YourEntity: type: entity table: your_table_name schema: 你的自定义schema名称 # 其余映射配置
注意事项
- 如果需要同时搜索多个schema,可以将设置语句修改为
SET search_path TO 自定义schema,public,查询时会优先匹配自定义schema下的表,未找到时再查找public schema,适配公共表存放在public的场景 - 修改配置后必须清空Symfony缓存才会生效,开发环境执行
php bin/console cache:clear,生产环境执行php bin/console cache:clear --env=prod --no-debug - 不建议直接修改PostgreSQL对应用户的默认search_path,该操作会影响所有使用该用户的数据库连接,与业务应用耦合度过高
内容的提问来源于stack exchange,提问作者bobi
相关产品推荐
相关产品推荐

