База данных Propel: reverse генерирует пустые атрибуты внешнего ключа в схеме - PullRequest
0 голосов
/ 16 мая 2018

У меня есть таблица, которая была создана с использованием следующего синтаксиса:

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 элемента foreign-key пуст, что, в свою очередь, не позволяет propel генерировать модели на основе этой схемы.

Я немного застрял здесь - любая помощь приветствуется

1 Ответ

0 голосов
/ 17 мая 2018

Я выяснил, в чем проблема. Для контекста я на Mac OS X и lower_case_table_names установлен на 2.

Смешанный чехол в DDL

Как вы можете видеть в опубликованном мною DDL, case_id в нижнем регистре, но определяется в таблице как Case_ID. MySQL не беспокоится об этой разнице, но это приводит к сбою кода обратного проектирования и генерации моделей Propel, поскольку он не может найти внешний ключ в определении таблицы.

Что меня здесь застряло, так это то, что даже если бы я вручную изменил DDL, чтобы он соответствовал регистру, несмотря ни на что, MySQL все равно будет генерировать DDL с строчной версией, если я воспользуюсь командой SHOW CREATE TABLE Cases;.

MySQL версии

Кажется, MySQL 8.x - версия, которую я использовал в разработке - демонстрирует это странное поведение. На данный момент это кажется мне ошибкой.

Я закончил с понижения до 5,7 и заново создал свою базу данных. MySQL 5.7 сохраняет регистр DDL, который вы предоставляете. Это, в свою очередь, позволяет Propel делать свое дело и успешно обновлять схему, а также генерировать модели.

Если кто-нибудь знает, почему две версии MySQL ведут себя по-разному, я хотел бы услышать, почему.

Эта проблема теперь решена с моей стороны. (хотя мне нужно будет изучить его снова, если и когда мы обновимся до 8.x)

...