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

时间:2009-09-10 13:41:59

标签: orm doctrine

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

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

9 个答案:

答案 0 :(得分:25)

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

尝试:

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

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

答案 1 :(得分:5)

对于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();

答案 2 :(得分:4)

我的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);
}

答案 3 :(得分:2)

老问题,但为未来的灵魂添加。

根据Meezaan-ud-Din's answer快速找到 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

答案 4 :(得分:1)

您可以在此要点找到我用来截断数据库中所有表的任务: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;'));

答案 5 :(得分:0)

是的,你肯定只能对一些表(不是全部)使用doctrine。它不会丢弃所有其他表。除非你手动运行

$manager->dropDatabases();

这是您可以开始为新表使用Doctine的方法:

  1. Setup DB Connection

  2. Setup Doctrine's files/directory structure

  3. Use Command Line Interface,以便根据数据库表自动生成所有Doctrine模型(和模式)(您可以手动删除不相关的模型)。

答案 6 :(得分:0)

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

也许这可能是'石灰',我不知道。

所以,我必须编写一个反向 - > gt; 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)在PHP内部从symfony外部执行它:

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

我关闭连接的原因是Postgres,MDBOC(我选择的数据库)不会删除具有连接的数据库。可能仍然存在某种问题。我告诉你,这简直就像简单的教程所显示的那样简单。它甚至可以使用microlop产品。

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

要从另一个命令中运行命令 bin/console doctrine:schema:drop --force,试试这个:

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