我对推进中的外键有疑问。 我的项目中有2个模式与2个物理数据库匹配: 我的本地人(DB One)和a 带有一些只读信息的远程DB(DB Two)
关键是我需要将一个外键从DB One设置为DB Two,但它不起作用。 这是我的架构:
架构1
<database package="dbOne" defaultIdMethod="native" name="dbOne">
<table name="tableOne">
<column name="pk_tableOne" type="INTEGER" primaryKey="true" required="true" autoIncrement="true"/>
<column name="column_one" type="DOUBLE" required="true"/>
<foreign-key name="fk_column_one" foreignTable="tableTwo" foreignSchema = "dbTwo">
<reference local="column_one" foreign="column_two"/>
</foreign-key>
</table>
</database>
架构2
<database package="dbTwo" defaultIdMethod="native" name="dbTwo">
<table name="tableTwo">
<column name="column_two" type="DOUBLE" primaryKey="true" required="true"/>
</database>
我已经使用两个数据源设置了runtime / build-conf.xml,在om / diff命令期间我收到了这个错误:
目标“om-template”的执行失败,原因如下: “tableOne”包含不存在的表“dbTwo.tableTwo”
的外键
我做错了什么?
答案 0 :(得分:1)
不幸的是,我认为您不能在不同的数据库上设置对表的外键引用。如果查看生成器文件,我们会看到以下行:
在propel/generator/lib/model/Table.php
,current github version中的第901行:
public function setupReferrers($throwErrors = false)
{
foreach ($this->getForeignKeys() as $foreignKey) {
// table referrers
$foreignTable = $this->getDatabase()->getTable($foreignKey->getForeignTableName());
if ($foreignTable !== null) {
...
} elseif ($throwErrors) {
throw new BuildException(sprintf(
'Table "%s" contains a foreign key to nonexistent table "%s"',
$this->getName(),
$foreignKey->getForeignTableName()
));
}
...
}
...
}
关键是它所说的$foreignTable = $this->getDatabase()...
,换句话说,它只能用于对该表自己的数据库的引用。我建议将你的声音添加到this github issue,这似乎是你要求的。
答案 1 :(得分:0)
您无法加入外国数据库。但是:如果您的数据库支持它(您需要像PGSQL这样的数据库),您可以将表放在同一数据库中的单独模式中。这为您提供了相同的表格分隔,但能够应用连接(以及设置外键)。