【问题标题】:Propel database:reverse generates empty foreign key attributes in schema推进数据库:反向生成schema中的空外键属性
【发布时间】:2018-05-16 03:03:38
【问题描述】:

我有一个使用以下语法创建的表:

CREATE TABLE `Agreements` (
  `Agreement_ID` int(30) NOT NULL AUTO_INCREMENT,
  `Case_ID` int(11) NOT NULL,
  KEY `fk_case_id` (`Case_ID`),
  CONSTRAINT `fk_case_id` FOREIGN KEY (`Case_ID`) REFERENCES `cases` (`case_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

运行propel database:reverse 时,生成的架构如下所示:

<?xml version="1.0" encoding="utf-8"?>
<database name="xxx" defaultIdMethod="native" defaultPhpNamingMethod="underscore">
  <table name="Agreements" idMethod="native" phpName="Agreements">
    <column name="Agreement_ID" phpName="AgreementId" type="INTEGER" size="30" autoIncrement="true" required="true"/>
    <column name="Case_ID" phpName="CaseId" type="INTEGER" required="true"/>
    <foreign-key foreignTable="Cases" name="fk_case_id">
      <reference local="Case_ID" foreign=""/>
    </foreign-key>
    <index name="fk_case_id">
      <index-column name="Case_ID"/>
    </index>
    <vendor type="mysql">
      <parameter name="Engine" value="InnoDB"/>
    </vendor>
  </table>
</database>

如您所见,foreign-key 元素的foreign 属性为空,这反过来又阻止了 propel 基于此架构生成模型。

我有点卡在这里 - 任何帮助将不胜感激

【问题讨论】:

    标签: php propel propel2


    【解决方案1】:

    我发现了问题所在。对于上下文,我在 Mac OS X 上并将 lower_case_table_names 设置为 2

    DDL 中的大小写混合

    正如您在我发布的 DDL 中看到的那样,case_id 是小写字母,但在表格中定义为 Case_ID。 MySQL 不关心这种差异,但这会导致 Propel 逆向工程和模型生成代码失败,因为它无法在表定义中找到外键。

    让我陷入困境的是,即使我手动更改 DDL 以匹配大小写,无论如何,如果我使用命令 SHOW CREATE TABLE Cases;,MySQL 仍然会生成小写版本的 DDL。

    MySQL 版本

    似乎 MySQL 8.x(我在开发中使用的版本)呈现出这种奇怪的行为。在这一点上,这对我来说似乎是一个错误。

    我最终做的是降级到 5.7 并重新创建我的数据库。 MySQL 5.7 保留了您提供的 DDL 的大小写。这反过来又允许 Propel 完成它的工作并成功更新架构以及生成模型。

    如果有人知道为什么这两个 MySQL 版本的行为不同,我很想听听为什么。

    这个问题现在在我这边解决了。 (尽管如果我们升级到 8.x,我需要再次研究它)

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2018-03-25
      • 1970-01-01
      • 2020-09-06
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多