Bas*_*der 5 postgresql schema pdo symfony doctrine-orm
我有一个包含多个模式的PG数据库.
我有一个symfony2应用程序,只需要连接其中一个.
如果我没有配置任何东西,默认情况下Doctrine2会在所有模式中进行搜索,因此它会尝试SELECT在桌面上进行不正确的操作.
我按照这个答案:symfony2 + doctrine2 @ postgresql设置架构
现在它似乎只是在我指定的shema中,但它仍然在寻找我的模式中没有的一些表,但在其他表中.
当我执行ldoctrine:migrations:diff时
[Doctrine\DBAL\DBALException]
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"
^
Run Code Online (Sandbox Code Playgroud)
因此,遵循学说迁移文档,我在连接配置中添加了这一行:
schema_filter: ~^(?!pgstats)~
Run Code Online (Sandbox Code Playgroud)
它总是试图SELECT在那些表格中制作......
您需要使用 migrate 命令的 --db-configuration 选项。它需要一个配置文件作为参数。尝试使用配置文件的以下内容。
<?php
return array(
"driverClass"=>"AppBundle\Driver",
"host" => "localhost",
"user" => "test",
"password" => "test",
"dbname" => "test"
);
?>
Run Code Online (Sandbox Code Playgroud)
此外,我更改了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']);
}
Run Code Online (Sandbox Code Playgroud)
(在假定模式名称 != 'public' 的两个地方添加了 or true )
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |