Doctrine ORM:删除所有表而不删除数据库

gpi*_*ino 14 orm doctrine

我必须使用现有数据库(不使用Doctrine管理),我只想将doctrine用于此数据库中的新表.

有没有办法告诉Doctrine不要在重新加载时删除整个数据库,而只是在yaml文件中定义的模型?

Mee*_*Din 28

我知道这是一个非常古老的问题,看来你正在使用symfony.

尝试:

app/console --env=prod doctrine:schema:drop --full-database
Run Code Online (Sandbox Code Playgroud)

这将删除数据库中的所有表.

  • 不要在生产中使用它我的朋友 (5认同)
  • 它将显示教义将做什么。--force属性将删除数据库。 (2认同)

Ser*_*osa 7

我这个 Symfony 命令删除所有表:

bin/console doctrine:schema:drop --full-database --force
Run Code Online (Sandbox Code Playgroud)

我在收到警告消息后添加了标志 --force 。


小智 6

对于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();
Run Code Online (Sandbox Code Playgroud)


Tho*_*aux 5

我的 2 美分,如果你想通过 PHP 做到这一点:

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

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

    $tool = new \Doctrine\ORM\Tools\SchemaTool($em);
    $tool->dropSchema($metaData);
    $tool->createSchema($metaData);
Run Code Online (Sandbox Code Playgroud)

这有点慢,您还可以删除所有表中的所有数据:

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

foreach($em->getSchemaManager()->listTableNames() as $tableName)
{
  $em->exec('DELETE FROM ' . $tableName);
}
Run Code Online (Sandbox Code Playgroud)


小智 0

@gpilotino 是的,我也有类似的问题。似乎没有办法从 PHPUnit 中删除和重建数据库(Symfony 测试的未来)。

也许“石灰”有可能,我不知道。

因此,我必须编写一个反向 ->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);
Run Code Online (Sandbox Code Playgroud)

2)在 PHP 内部从 symfony 外部执行它:

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

我关闭连接的原因是 Postgres、MDBOC(我选择的数据库)不会删除具有连接的数据库。可能仍然存在某种问题。我告诉你,它永远不会像简单教程所示那么简单。对于微坡产品来说情况更糟。