使用Doctrine2和PostgreSQL进行多个DB Schema和迁移
发布时间:2020-12-13 16:07:24 所属栏目:百科 来源:网络整理
导读:我有一个包含多个模式的PG数据库. 我有一个symfony2应用程序,只需要连接其中一个. 如果我没有配置任何东西,默认情况下Doctrine2会搜索所有模式,因此它会尝试在表中没有权限的情况下进行SELECT. 我按照这个答案:symfony2 + doctrine2@postgresql setting a s
我有一个包含多个模式的PG数据库.
我有一个symfony2应用程序,只需要连接其中一个. 如果我没有配置任何东西,默认情况下Doctrine2会搜索所有模式,因此它会尝试在表中没有权限的情况下进行SELECT. 我按照这个答案:symfony2 + doctrine2@postgresql setting a schema 现在它似乎只是在我指定的shema中,但它仍然在寻找我的模式中没有的一些表,但在其他表中. 当我执行ldoctrine:migrations:diff时 [DoctrineDBALDBALException] An exception occurred while executing 'SELECT min_value,increment_by FROM "pgstatspacknameid"': SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "pgstatspacknameid" does not exist LINE 1: SELECT min_value,increment_by FROM "pgstatspacknameid" ^ [PDOException] SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "pgstatspacknameid" does not exist LINE 1: SELECT min_value,increment_by FROM "pgstatspacknameid" ^ 因此,遵循学说迁移文档,我在连接配置中添加了这一行: schema_filter: ~^(?!pgstats)~ 它总是试图在那些表中制作SELECT … 解决方法
您需要选择–db-configuration to migrate命令.
它将配置文件作为参数. 尝试使用配置文件的以下内容. <?php return array( "driverClass"=>"AppBundleDriver","host" => "localhost","user" => "test","password" => "test","dbname" => "test" ); ?> 此外,我更改了vendor / doctrine / dbal / lib / Doctrine / DBAL / SchemaPostgreSqlSchemaManager.php,以便始终将模式添加到序列名称中. 像这样: /** * {@inheritdoc} */ protected function _getPortableSequencesList($sequences) { $sequenceDefinitions = array(); foreach ($sequences as $sequence) {//+ || true if ($sequence['schemaname'] != 'public' || true) { $sequenceName = $sequence['schemaname'] . "." . $sequence['relname']; } else { $sequenceName = $sequence['relname']; } $sequenceDefinitions[$sequenceName] = $sequence; } $list = array(); foreach ($this->filterAssetNames(array_keys($sequenceDefinitions)) as $sequenceName) { $list[] = $this->_getPortableSequenceDefinition($sequenceDefinitions[$sequenceName]); } return $list; } /** * {@inheritdoc} */ protected function getPortableNamespaceDefinition(array $namespace) { return $namespace['nspname']; } /** * {@inheritdoc} */ protected function _getPortableSequenceDefinition($sequence) {//+ || true if ($sequence['schemaname'] != 'public' || true) { $sequenceName = $sequence['schemaname'] . "." . $sequence['relname']; } else { $sequenceName = $sequence['relname']; } $data = $this->_conn->fetchAll('SELECT min_value,increment_by FROM ' . $this->_platform->quoteIdentifier($sequenceName)); return new Sequence($sequenceName,$data[0]['increment_by'],$data[0]['min_value']); } (在假定模式名称!=’public’的两个地方添加或者真实) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |