Aug 17 2008

Объявление типов столбцов (enum, datetime, tinytext, year) для MySQL, которые явно не поддерживаются в Propel 1.3

Category: Symfonyingvar @ 22:06

В документации Propel можно увидеть таблицы соответствия между ним и типами столбцов MySQL (Propel Column Types). Проблема в том, что не все типы столбцов можно явно указать.
Если попытаться указать поле типа ENUM, то при генерировании SQL получим ошибку:

Cannot map unknown Propel type 'ENUM' ...
Cannot map unknown Propel type 'ENUM' to native database type ..

Похожая ситуация наблюдается и в следующем примере. Например, если в схеме указать нижеследующее, то получим ошибку на счет поля created_at ( Cannot map unknown Propel type ‘DATETIME’ to native database type ):

my_product_i18n:
_attributes: { phpName: ProductI18n }
id:          { type: integer, required: true, primaryKey: true, foreignTable: my_product, foreignReference: id }
culture:     { isCulture: true, type: varchar, size: 7, required: true, primaryKey: true }
name:        { type: varchar, size: 50 }
created_at:  { type: datetime }


Рабочий пример для enum, datetime, tinytext, date:

my_product_i18n:
_attributes: { phpName: ProductI18n }
id:          { type: integer, required: true, primaryKey: true, foreignTable: my_product, foreignReference: id }
culture:     { isCulture: true, type: varchar, sqltype:enum, size: "'ru_RU','uk_UA','en_EN'", default: ru_RU, required: true, primaryKey: true }
name:        { type: varchar, size: 50 }
description: { type: longvarchar, sqltype:tinytext }
year:        { type: date, sqltype:year }
year2:       { type: varchar, sqltype:year }
created_at:  { type: timestamp, sqltype:datetime }

Зачем столбец culture переделали в тип enum? С точки зрения оптимизации базы данных. Минусы такого решения:
• языки указываются жестко
• админка ещё не проверялась

Единственное, что не удалось так это задействовать тип столбца set.

Update: 2009-04-23

Тот способ который описан выше, сработал для генерации правильного SQL кода, но его не следует использовать, т.к. это вызывает ошибки при определенных ситуациях. Например, при генерации объектов модели в Map файлах видим следующую ситуацию:

# Наш сгенерированный код
$tMap->addPrimaryKey('CULTURE', 'Culture', 'VARCHAR', true, 'ru','uk','en');

# Функция из класса TableMap.php
public function addColumn($name, $phpName, $type, $isNotNull = false, $size = null, $pk = null, $fkTable = null, $fkColumn = null)

что значения (‘uk’,’en’) передаются как аргументы функции ($pk и fkTable)!!! А это не есть хорошо.

Предлагаю новый рабочий вариант schema:

table1:
  id: ~
  type:  { type: varchar,sqlType: "enum('none','page','dir')", required: true, default: 'none' }

Тут сознательно опущен атрибут «size: 255«, т.к. он создает неправильный sql-код для создание таблицы.

Ссылки по теме:
Propel user guide: Column Types
Propel ticket #462: more datatypes for mysql
Propel ticket #77: Add ENUM support for MySQL

Tags: ,

5 Responses to “Объявление типов столбцов (enum, datetime, tinytext, year) для MySQL, которые явно не поддерживаются в Propel 1.3”

  1. b166er says:

    est esho odin sposob:
    http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/Inheritance
    s etim sposobom moshna i realisovat «set»-class tip
    ili ja oshibajus?

  2. ingvar says:

    В статье говориться о наследовании. Мне непонятно как это применить к объявлению типов столбцов и главное как указать для Симфони все это в yml?

  3. b166er says:

    указывается это дело в schema.xml, заметь не yml.
    как я там понял, можна указать свой класс на столбец.
    моя идея: сделать класс «ColumnTypeSet» и определить на столбец. в классе можна сделать напр.:
    switch($input){case ‘test1’:…
    во всяком случае можна по экспериментировать с этим feature.

  4. Denis says:

    а можно ли указать sql type: mediumtext ???
    desc {type: longvarchar, sqltype: mediumtext} => на выходе type = text
    type: clob не подходит

  5. ingvar says:

    > desc {type: longvarchar, sqltype: mediumtext} => на выходе type = text
    Думаю должно сработать. Обрабатывать Propel будет как text,а в CREATE TABLE должен вставить mediumtext. Но надо пробывать.

Leave a Reply to ingvar