Doctrine ORM: удалить все таблицы без удаления базы данных

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

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


person gpilotino    schedule 10.09.2009    source источник


Ответы (8)


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

Пытаться:

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

Это приведет к удалению всех таблиц в БД.

person Meezaan-ud-Din    schedule 19.08.2016
comment
Он покажет, что будет делать Doctrine. Атрибут --force отбросит БД. - person ptyskju; 21.11.2016
comment
не используйте это в производстве, друзья мои - person Adrien G; 13.12.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();
person Gebus    schedule 20.09.2017
comment
Также работает с TRUNCATE. Полезно, когда у Doctrine Fixtures возникают проблемы с очисткой базы данных. - person vctls; 26.11.2018

Я использую эту команду Symfony для удаления всех таблиц:

bin/console doctrine:schema:drop --full-database --force

Я добавил флаг --force после получения предупреждающего сообщения.

person Sergio Barbosa    schedule 06.11.2019

Мои 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);
}
person Thomas Decaux    schedule 24.04.2017
comment
Ваше второе предложение не сработает ни для каких ассоциаций из-за ограничений внешнего ключа - person olidem; 03.01.2019

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

Основываясь на ответе Meezaan-ud-Din, быстро нашел его для 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

person rkeet    schedule 03.05.2018

@ gpilotino Да, у меня похожая проблема. Кажется, НЕЛЬЗЯ отбросить и перестроить базу данных из PHPUnit (будущее тестирования Symfony).

Может, это возможно в «лайме», не знаю.

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

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

1) используя Task изнутри 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 (мой выбор db) не удалит базу данных, имеющую соединение. Наверное, ВСЕ ЕЩЕ какая-то проблема. Я говорю тебе, это НИКОГДА не так просто, как показывают простые уроки. А с продуктами с микрошлифом даже ХУЖЕ.

person user327312    schedule 15.07.2010

Чтобы запустить команду bin/console doctrine:schema:drop --force изнутри другой команды, попробуйте следующее:

$command = $this->getApplication()->find('doctrine:schema:drop');
$returnCode = $command->run(new ArrayInput(['--force' => true]), $output);
person qwertz    schedule 23.03.2021

person    schedule
comment
Устаревший и не работает в текущей версии Doctrine. - person mindplay.dk; 21.10.2015