【问题标题】:Doctrine ORM: drop all tables without dropping databaseDoctrine ORM:删除所有表而不删除数据库
【发布时间】:2010-11-27 04:24:11
【问题描述】:

我必须使用现有的数据库(不是用 Doctrine 管理的),并且我只想对这个数据库中的新表使用原则。

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

【问题讨论】:

    标签: orm doctrine


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        老问题,但为未来的灵魂补充。

        基于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】:

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

          【讨论】:

          • 也适用于 TRUNCATE。当 Doctrine Fixtures 无法清除数据库时很有用。
          【解决方案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);
          

          这个有点慢,你也可以删除所有表的所有数据:

          $em = getContainer()->get('doctrine.dbal.default_connection');
          
          foreach($em->getSchemaManager()->listTableNames() as $tableName)
          {
            $em->exec('DELETE FROM ' . $tableName);
          }
          

          【讨论】:

          • 由于外键限制,您的第二个提案将因任何关联而失败
          【解决方案6】:

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

          试试:

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

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

          【讨论】:

          • 它将显示 Doctrine 会做什么。 --force 属性将删除数据库。
          • 朋友们不要在生产中使用它
          【解决方案7】:

          @ 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);
          

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

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

          我关闭连接的原因是 Postgres、MDBOC(我选择的数据库)不会删除具有连接的数据库。可能仍然是某种问题。我告诉你,它从来没有像简单教程显示的那么简单。而 microslop 产品的情况更糟。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • 已过时且不适用于当前版本的 Doctrine。
            猜你喜欢
            • 2023-03-30
            • 1970-01-01
            • 2020-04-18
            • 1970-01-01
            • 2018-03-01
            • 2017-04-07
            • 1970-01-01
            • 1970-01-01
            • 2018-11-15
            相关资源
            最近更新 更多