symfony2-无法更新架构基表或视图已存在

6vl6ewon  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(337)

我有两个单独的symfony项目与一个数据库。第一个项目在symfony3.2上,第二个项目在symfony2.8上。数据库是mysql。一切都在生产阶段,一切正常。
现在我在第一个项目中有一些实体类,而在第二个项目中没有。我们以前不需要第二个项目中的实体,但现在我需要在第二个项目中使用它们。
我将实体从第一个项目复制到第二个项目。我们使用注解。
之后,我检查了我的数据库,并在第二个项目上执行了命令:app/consoledoctrine:schema:update--force并获取错误:基表或视图已存在:1050表“crm\u user”已存在。如果我使用--dump sql选项(app/console)执行命令doctrine:schema:update--dump sql)我看到创建的表已经存在!
创建表crm\u user(id int auto\u increment not null。。。
因此,条令模式更新没有看到db表已经创建。如何修复?我试图清除所有的缓存(cache:clear),元数据缓存(doctrine:cache:清除元数据),查询缓存(doctrine:cache:清除查询),不成功。在这之后我也犯了同样的错误。如果我尝试验证模式,就不会有新表。当然,我不能删除表数据,因为所有的表都在生产阶段。
可能有人面临这样的问题。我很感激你的建议。

lfapxunr

lfapxunr1#

我强烈建议不要把两个不同的项目和一个数据库搞得一团糟。如果你需要这样做,那么简单地让一个成为你做修改的原则“主人”,只有在那里运行schema:update. 比这更好,更优雅的方式,将是创建一个供应商,您可以导入与 composer ,它是您的供应商。这将管理所有的数据库/存储库,并且您可以将它重新用于许多只在一个地方有代码的不同项目。
这将解决这个问题,并修复我认为您做得不对的地方:让重复的实体指向相同的db结构,这将始终是一个痛苦的维护,而且它不能很好地处理kiss原则和代码复制。

cyvaqqii

cyvaqqii2#

如果您不能像jason建议的那样通过composer使用共享项目包含orm定义,那么您可以创建一个regex来过滤每个应用程序应该关注哪些表。
zend expressive示例:

/**
 * @var \Doctrine\ORM\EntityManager $em
 */
$em = $container->get('doctrine.entity_manager.orm_default'); // substitute with how you get your entity manager 
$filter = 'crm_user|other_table|another_table';
$em->getConnection()
   ->getConfiguration()
   ->setFilterSchemaAssetsExpression('/'.$filter.'/');

动态。。。

/**
 * @var \Doctrine\ORM\EntityManager $em
 */
$em = $container->get('doctrine.entity_manager.orm_default');
$metadata = $em->getMetadataFactory()->getAllMetadata();
if(!empty($metadata)){
    $filter = '';
    /**
     * @var \Doctrine\ORM\Mapping\ClassMetadata $metadatum
     */
    foreach($metadata as $metadatum){
        $filter .= ($metadatum->getTableName().'|');
        $assocMappings = $metadatum->getAssociationMappings();
        if(!empty($assocMappings)){
            // need to scoop up manyToMany association table names too
            foreach($assocMappings as $fieldName => $associationData){
                if(isset($associationData['joinTable'])){
                    $joinTableData = $associationData['joinTable'];
                    if(isset($joinTableData['name']) && strpos($filter, $joinTableData['name']) === false){
                        $filter .= ($joinTableData['name'].'|');
                    }
                }
            }
        }
    }
    $filter = rtrim($filter, '|');
    $em->getConnection()->getConfiguration()
        ->setFilterSchemaAssetsExpression('/'.$filter.'/');
}

相关问题