学说ORM:删除所有的表,而不用删除数据库(Doctrine ORM: drop all table

2019-08-04 19:13发布

我有现有的数据库(不与原则管理)的工作,我想用教条仅对该数据库的新表。

有没有办法告诉学说不删除整个DB上重装,但在只定义模型yaml文件?

Answer 1:

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

尝试:

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

这将降低在数据库中的所有表。



Answer 2:

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


Answer 3:

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


Answer 4:

老问题,但增加了对未来的灵魂。

基于Meezaan ud声浪的答案很快发现它的Zend Framework 3 + 2原则

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

不要在生产中不能使用

  • orm:schema-tool:drop到“滴”数据库
  • --full-database消灭在数据库中的一切是由原则管理
  • 要执行,您必须使用--force (或-f
  • --dump-sql来显示正在执行的SQL。 可以与结合-f标志。

执行完整的代码在类中: \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand



Answer 5:

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


Answer 6:

是的,当然,你可以使用原则仅适用于某些表(不是全部)。 而且它不会删除所有其他表,除非你手动运行

$manager->dropDatabases();

这是你如何开始使用Doctine为您的新表:

  1. 设置DB连接

  2. 安装学说的文件/目录结构

  3. 使用命令行界面 ,以便自动生成基于数据库表(可以手动删除unncessesary机型)全部学说模型(和架构)。



Answer 7:

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

也许这是在“石灰”可能的话,我不知道。

所以,我有写反 - 即备份所有数据从数据库中,然后重置所有序列,这样我可以做自动化测试>保存()函数。

对于那些不希望在我的挫折我都尝试遵循谁:

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(我选择的DB)不会下降,有一个连接的数据库。 也许仍然是某种问题。 我告诉你,这是从来没有的简单教程显示一样容易。 而且这更糟糕的与microslop产品。



文章来源: Doctrine ORM: drop all tables without dropping database
标签: orm doctrine