Doctrine ORM: удалить все таблицы без удаления базы данных - PullRequest
14 голосов
/ 10 сентября 2009

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

есть ли способ сказать Doctrine не сбрасывать всю БД при перезагрузке, а только модели, определенные в файле yaml?

Ответы [ 7 ]

26 голосов
/ 19 августа 2016

Я знаю, что это очень старый вопрос, и кажется, что вы используете Symfony.

Попытка:

app/console --env=prod doctrine:schema:drop --full-database

Это удалит все таблицы в БД.

5 голосов
/ 20 сентября 2017

Для Symfony 3:

$entityManager = $container->get('doctrine.orm.entity_manager'); 

$entityManager->getConnection()->getConfiguration()->setSQLLogger(null);

$entityManager->getConnection()->prepare("SET FOREIGN_KEY_CHECKS = 0;")->execute();

foreach ($entityManager->getConnection()->getSchemaManager()->listTableNames() as $tableNames) {
        $sql = 'DROP TABLE ' . $tableNames;
        $entityManager->getConnection()->prepare($sql)->execute();
}
$entityManager->getConnection()->prepare("SET FOREIGN_KEY_CHECKS = 1;")->execute();
4 голосов
/ 24 апреля 2017

Мои 2 цента, если вы хотите сделать это через Php:

    $em = ....getContainer()->get('doctrine')->getManager();

    $metaData = $em->getMetadataFactory()->getAllMetadata();

    $tool = new \Doctrine\ORM\Tools\SchemaTool($em);
    $tool->dropSchema($metaData);
    $tool->createSchema($metaData);

Это немного медленно, вы также можете удалить все данные из всех таблиц:

$em = getContainer()->get('doctrine.dbal.default_connection');

foreach($em->getSchemaManager()->listTableNames() as $tableName)
{
  $em->exec('DELETE FROM ' . $tableName);
}
2 голосов
/ 03 мая 2018

Старый вопрос, но добавление для будущей души.

На основании ответа Мизан-уд-Дина быстро нашел его для Zend Framework 3 + Doctrine 2

./vendor/bin/doctrine-module orm:schema-tool:drop --full-database -f --dump-sql

НЕ использовать в производстве

  • orm:schema-tool:drop для удаления базы данных
  • --full-database, чтобы уничтожить все в базе данных , которой управляет Doctrine !
  • Для выполнения необходимо использовать --force (или -f)
  • --dump-sql, чтобы показать выполняемый SQL. Может сочетаться с флагом -f.

Полный код для выполнения найден в классе: \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand

1 голос
/ 19 августа 2011

Вы можете найти задачу, которую я использую, чтобы обрезать все таблицы из БД, в этом списке: https://gist.github.com/1154458

Основной код:

        $this->dbh = $connection->getDbh();
        $this->dbh->query(sprintf('SET FOREIGN_KEY_CHECKS = 0;'));
        $tables = $connection->import->listTables();
        foreach ($tables as $table)
        {
          $this->dbh->query(sprintf('TRUNCATE TABLE %s', $tableName));
        }
        $this->dbh->query(sprintf('SET FOREIGN_KEY_CHECKS = 1;'));
0 голосов
/ 16 июля 2010

@ gpilotino Да, у меня похожая проблема. Кажется, НЕТ СПОСОБА удалить и перестроить базу данных изнутри PHPUnit (будущее тестирования Symfony).

Может быть, это возможно в «извести», я не знаю.

Итак, мне нужно написать функцию reverse -> save (), которая возвращает все данные из базы данных, а затем сбрасывает все последовательности, чтобы я мог провести автоматическое тестирование.

Для тех, кто не хочет следовать за моим разочарованием, я попробовал оба:

1) используя задачу изнутри Symfony:

  $optionsArray=array();
  $argumentsArray=array();

  $optionsArray[]="--all";
  $optionsArray[]="--and-load";
  $optionsArray[]="--no-confirmation";

  $task = new sfDoctrineBuildTask($configuration->getEventDispatcher(), new sfFormatter());
  $task->run($argumentsArray, $optionsArray);

2) Выполнение этого извне Symfony внутри PHP:

  Doctrine_Manager::getInstance()->getCurrentConnection()->close();
  exec('./symfony doctrine:build --all --and-load --no-confirmation');

Причина, по которой я закрыл соединение, заключается в том, что Postgres, MDBOC (мой БД выбора) не будет удалять базу данных, которая имеет соединение. Вероятно, это все еще какая-то проблема. Я говорю вам, это НИКОГДА не так просто, как показывают простые уроки. И это даже хуже, с продуктами с микрослочками.

0 голосов
/ 18 октября 2009

Да, конечно, вы можете использовать доктрину только для некоторых таблиц (не для всех). И он не удалит все остальные таблицы., Если вы не запустите вручную

$manager->dropDatabases();

Вот как вы можете начать использовать Doctine для новых таблиц:

  1. Настройка подключения к БД

  2. Настройка файлов / структуры каталогов Doctrine

  3. Используйте интерфейс командной строки , чтобы автоматически генерировать все модели Doctrine (и схемы) на основе таблиц БД (можно удалить ненужные модели вручную).

...