Создать базу данных MyISAM Doctrine 2

Я использую Doctrine для создания и обновления моей БД на основе моих сущностей. Кроме того, я использую движок MyISAM на своих таблицах. Для этого я добавил свои аннотации, например:

/** (...) @ORM\Table(name="user",options={"engine":"MyISAM", "charset"="utf8"}) */

Таблицы были сгенерированы как MyISAM обычно, но когда я пытаюсь их обновить, теперь доктрина пытается сгенерировать FK. Затем я получил:

 General error: 1215 Cannot add foreign key constraint

Я знаю, что MyISAM не поддерживает FK, есть ли способ указать доктрине пропустить создание FK?

Я использую как orm:schema-tools:update (в DEV), так и миграции (в PROD). Также я использую zf2.


person diegopso    schedule 05.10.2015    source источник


Ответы (2)


Основываясь на этой теме, я нашел решение.

Я добавил прослушиватель событий в EM.

$em->getEventManager()->addEventSubscriber(new DropForeignKeysListener());

Это событие удаляет все FK из схемы, сгенерированной из аннотаций, как:

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Tools\ToolEvents;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;

class DropForeignKeysListener implements EventSubscriber
{
    public function postGenerateSchema(GenerateSchemaEventArgs $args) {
        $schema = $args->getSchema();

        $table_names = $schema->getTableNames();
        foreach ($table_names as $table_name) {
            $table = $schema->getTable($table_name);
            $fks = $table->getForeignKeys();

            foreach ($fks as $fk => $obj) {
                $table->removeForeignKey($fk);
            }
        }
    }

    public function getSubscribedEvents() {
        return array(ToolEvents::postGenerateSchema);
    }

}
person diegopso    schedule 12.10.2015

Механизм хранения MyISAM не поддерживает блокировку на уровне строк, внешние ключи и даже не поддерживает транзакции. Ознакомьтесь с этим вопросом, чтобы получить более подробный ответ.

Если у вас нет конкретной и веской причины для использования MyISAM, я настоятельно рекомендую вместо этого использовать InnoDB.

Вы также можете прочитать это сравнение между InnoDB и MyISAM.

person edigu    schedule 05.10.2015
comment
Я знаю, что он не поддерживает FK (возможно, я не уточняю в вопросе), я просто хочу избежать создания при попытке обновить БД. В противном случае мне придется сбросить SQL и удалить операторы создания вручную. Также я могу изменить это, но теперь, даже если я это сделаю, мне будет любопытно, как мне действовать, чтобы избежать этого. Например, теперь я думаю об использовании подписчика событий, как здесь: Schema-Tool для игнорирования объекта. Это ближе к ответу, который я ищу. - person diegopso; 05.10.2015