标签: doctrine-migrations

如何停止Doctrine2 Migrations:Diff总是添加数据库中已存在的外键关系?

我正在使用doctrine2和symfony2.1项目.我有一个与其他表有多对多关系的实体.这些多对一的外键关系已在数据库中更新,但每次运行迁移时:diff或schema:update --dump-sql都会添加相同的更新命令以再次添加外键关系.当我运行schema时:验证它说我的映射与我的数据库不同步.

我的应用程序工作正常,关系正常工作,我的数据库中的架构看起来正确.为什么教条还在尝试添加这些外键?

这是我的代码(对于一个有问题的参数):

在我的"Ticket"实体中,我有:

/**
 * Authenticated User who scored the ticket. 
 *
 * @ORM\ManyToOne(targetEntity="CS\SecurityBundle\Entity\User")
 * @ORM\JoinColumn(name="scoring_user_id", referencedColumnName="id")
 */
protected $scoringUser;
Run Code Online (Sandbox Code Playgroud)

我目前将其设置为单向,因此User实体中没有inversedBy.

这会在我的迁移或模式中生成以下内容:更新转储,即使它已在数据库中:

$this->addSql("ALTER TABLE tickets ADD CONSTRAINT FK_54469DF4BB0D9452 FOREIGN KEY (scoring_user_id) REFERENCES users (id)");
Run Code Online (Sandbox Code Playgroud)

知道我在这里做错了吗?

php mysql symfony doctrine-orm doctrine-migrations

24
推荐指数
1
解决办法
2042
查看次数

如何编写可以将数据重新分配到新表的Doctrine迁移

我有一个数据库(实际上是在Symfony1应用程序中使用Propel创建的).我在Symfony2和Doctrine中重新实现它,但我也想借此机会在某种程度上重构数据库.

我已经定义了一组Doctrine Entities并运行了doctrine:migrations:diff,它创建了一个基本的Migration来添加表,列和约束,并删除一堆列.

但是,在删除这些列之前,我想将数据复制到一些新表中,然后将这些表中的新记录链接到第一个表中的新列.我不相信在纯SQL中可以这样做(通常,一个表的内容分布在三个或四个表中).

给了我一个提示,并让我找到了这个(我已经跳过了,因为我不知道"容器"与我的问题有什么相关性).

但是我在Symfony或Doctrine文档中没有找到的是在迁移中实际移动数据的一个例子 - 对我来说这似乎是迁移的核心目的之一!

我可以使用上面那些链接中的提示,但后来我不知道如何继续.我没有(并且真的不想花时间创建,虽然我确定我能做到)现有数据库模式的Doctrine实体:我可以使用DQL吗?我根本就不知道.

所以有两个问题:

  1. 有人能给我一个在表之间移动数据的Doctrine迁移的例子吗?

  2. 或者,任何人都可以澄清DQL的语法如何依赖于Doctrine中实体的定义?我可以使用它来指定不在实体定义中的列吗?

php symfony doctrine-orm doctrine-migrations

15
推荐指数
1
解决办法
9930
查看次数

使用symfony 3执行使用doctrine迁移的下一个/上一个迁移

我知道,我可以运行使用特定迁移executeup/ down和版本号,即

doctrine:migrations:execute YYYYMMDDHHMMSS --down

那么我的问题是 - 是否有一种更简单的方法来简单地运行下一个或上一个迁移而无需查找版本号?

理想情况下,我想要像

doctrine:migrations:execute --down n

n指定方向上从当前运行的迁移数在何处.

(同样的想法rake db:rollback STEP=n)

php symfony doctrine-orm doctrine-migrations symfony-3.3

11
推荐指数
1
解决办法
3290
查看次数

将Docker容器部署到AWS时运行数据库迁移命令

请多多包涵.Docker相当新鲜.

我正在使用CodeDeploy将Docker容器(已分离)部署到AWS EC2注册表.在部署时,在设置一些环境变量等后运行以下命令:

exec docker run -d ${PORTS} -v cache-${CACHE_VOLUME} --env-file $(dirname $0)/docker.env --tty "${IMAGE}:${TAG}"
Run Code Online (Sandbox Code Playgroud)

容器运行在EC2 Container Service中定位和标记的图像.到目前为止没问题.

由于这是一个PHP应用程序(特别是Symfony2应用程序),我通常需要发出以下命令来执行部署时的数据库迁移:

 php app/console doctrine:migrations:migrate --no-interaction
Run Code Online (Sandbox Code Playgroud)

现在,是否有任何在"docker run ..."期间运行此命令同时保持容器运行,或者我是否需要专门为此命令运行另一个容器?

非常感谢!

php amazon-ec2 symfony doctrine-migrations docker

10
推荐指数
2
解决办法
5847
查看次数

防止Doctrine migration diff删除表

我目前正处于"Doctrinizing"大型现有数据库的过程中.这个过程非常有效,我们可以慢慢地用实体和DQL替换旧的原始查询代码.

我们最近发现了令人敬畏的Doctrine Migrations项目,它似乎是管理数据库更改的理想选择.然而,我们遇到了一些麻烦.

我们的数据库非常庞大,我们正在逐步重构应用程序的各个方面.我们目前有大约40%的数据库表示为实体.问题是当我们在部分转换的数据库上运行"diff"时,diff想要删除大量的表,因为这些表不存在任何实体.我们可以手动编辑差异,但它会变得非常麻烦并且可能容易出错.

问题是; 它可以创建一个diff并告诉diff进程不要删除任何没有实体的表吗?

doctrine doctrine-migrations

9
推荐指数
1
解决办法
3148
查看次数

学说迁移:diff 重新生成相同的唯一索引约束

我有一个奇怪的问题。当我运行时doctrine-migrations migrations:diff,它会重新生成在早期迁移中已设置的索引。

早期迁移(uniq 索引也存在于我的数据库中):

$this->addSql('CREATE TABLE my_table (id INT AUTO_INCREMENT NOT NULL, email VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_4VBV083VA6917B55 (email), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB');
Run Code Online (Sandbox Code Playgroud)

运行后重新生成doctrine-migrations migrations:diff

$this->addSql('DROP INDEX uniq_4vbv083va6917b55 ON my_table');
$this->addSql('CREATE UNIQUE INDEX UNIQ_J43107ECE6416I64 ON contact_company (email)');
Run Code Online (Sandbox Code Playgroud)

注意小写到大写。也许这意味着什么。在我之前的迁移中,我将它设置为大写,并且它在我的数据库中也显示为大写,所以我不知道为什么它在这里是小写。

我在我的实体中定义了这样的唯一约束:

/**
 * @ORM\Column(type="string", unique=true)
 */
private string $email;
Run Code Online (Sandbox Code Playgroud)

php doctrine symfony doctrine-orm doctrine-migrations

9
推荐指数
1
解决办法
1540
查看次数

尝试运行 down/rollback 命令时出现 Doctrine Migration 类未找到错误

当我运行时,bin/console doctrine:migrations:list我看到迁移列出为:

Application\Migrations\Version20210909072642

我正在尝试回滚迁移,并且尝试了几个不同的版本:

bin/console --env=dev doctrine:migrations:execute 'Application\DoctrineMigrations\Version20210909072642' --down --no-interaction -vvv
bin/console --env=dev doctrine:migrations:execute Version20210909072642 --down --no-interaction -vvv
bin/console --env=dev doctrine:migrations:execute 20210909072642 --down --no-interaction -vvv
Run Code Online (Sandbox Code Playgroud)

最近的DoctrineMigrationsBundle更新是否改变了此功能?

每次我运行它时都会出现以下错误:

In MigrationClassNotFound.php line 15:
                                                          
  [Doctrine\Migrations\Exception\MigrationClassNotFound]  
  Migration class "20210909072642" was not found?   
Run Code Online (Sandbox Code Playgroud)

我的 Doctrine 配置如下所示:

doctrine_migrations:
    migrations_paths:
        'Application\Migrations': 'app/DoctrineMigrations'
    storage:
        table_storage:
            table_name: 'migration_versions'
Run Code Online (Sandbox Code Playgroud)

php doctrine symfony doctrine-orm doctrine-migrations

9
推荐指数
2
解决办法
1万
查看次数

Doctrine 迁移始终生成空的 up() 和 down() 迁移,并将整理更改为“utf8mb4_unicode_ci”

当我运行时php bin/console doctrine:migrations:diff,我总是得到以下新生成的迁移:

<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class Version20220221174647 extends AbstractMigration
{
    public function getDescription(): string
    {
        return '';
    }

    public function up(Schema $schema): void
    {
        
    }

    public function down(Schema $schema): void
    {
        // example with one table but migration generates this for all varchar column, in all tables
        $this->addSql('ALTER TABLE address CHANGE company_name company_name VARCHAR(100) DEFAULT NULL COLLATE `utf8mb4_unicode_ci`, CHANGE address_line1 address_line1 VARCHAR(100) DEFAULT NULL COLLATE `utf8mb4_unicode_ci`, CHANGE zip_code zip_code VARCHAR(10) DEFAULT …
Run Code Online (Sandbox Code Playgroud)

mysql doctrine symfony doctrine-orm doctrine-migrations

8
推荐指数
1
解决办法
1461
查看次数

Doctrine 迁移:为 mysql 和 postgresql 创建代码

我在 Symfony 3.4.4 项目中使用 Doctrine ORM 2.6.1。我的一些实例在 MySQL 数据库上运行,一些在 Postgresql 上运行,还有一些安装甚至可以访问 MicosoftSQL 服务器。这工作正常,无需对我的项目或实体进行任何特殊更改,我只需配置相应的连接参数。

但是:如果我创建迁移,则只会在迁移文件中创建与当前数据库连接兼容的语句。

我使用 postgres 连接进行开发,所以我只生成 postgresql 语句,例如:

class Version20180430083616 extends AbstractMigration
{
    public function up(Schema $schema)
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');

        $this->addSql('DELETE FROM document_category');
        $this->addSql('DROP SEQUENCE document_category_id_seq CASCADE');
        $this->addSql('DROP TABLE document_category');
    }

    public function down(Schema $schema)
    {
        // this down() migration is auto-generated, please modify it to your needs …
Run Code Online (Sandbox Code Playgroud)

doctrine doctrine-migrations

7
推荐指数
1
解决办法
3744
查看次数

学说迁移:无法将多个命令插入准备好的语句中

我正在尝试为项目准备第一次迁移,该项目有相当大的 postgres 数据库。我已经转储了生产数据库模式,清除了注释和空行,并将整个内容作为文本放入单个变量中。然后我打电话

$this->addSql($sql);
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此迁移时,我的脸被打了一拳

SQLSTATE[42601]:语法错误:7 错误:无法将多个命令插入准备好的语句中

我真的需要将每个 SQL 命令拆分为单独的 addSql 方法调用吗?清除的转储中有几千行 SQL。手动完成会很痛苦,而且我不愿意用脚本来完成,因为可能会出现问题,而我甚至不会注意到它。

php postgresql doctrine database-migration doctrine-migrations

7
推荐指数
0
解决办法
593
查看次数