【问题标题】:Database FAIL - The database schema is not in sync with the current mapping file数据库失败 - 数据库架构与当前映射文件不同步
【发布时间】:2020-07-27 17:48:23
【问题描述】:

谁能解释一下以下原则架构验证错误消息:

这是 manyToMany 关系中每个实体的 yaml ORM 定义,根据documentation 的第 5.9 节创建。

Rep\Bundle\ProjectBundle\Entity\User:
    type: entity
    table: User
    fields:
        id:
            id: true
            type: integer
            unsigned: true
            nullable: false
            generator:
                strategy: AUTO
        username:
            type: string
            length: 25
            fixed: false
            nullable: false
        salt:
            type: string
            length: 32
            fixed: false
            nullable: false
        password:
            type: string
            length: 40
            fixed: false
            nullable: false
        email:
            type: string
            length: 60
            fixed: false
            nullable: false
    manyToMany:
        roles:
            targetEntity: UserRole
            inversedBy: users
            joinTable:
                name: UserRoleLookup
                joinColumns:
                    user_id:
                        referencedColumnName: id
                inverseJoinColumns:
                    user_role_id:
                        referencedColumnName: id
    lifecycleCallbacks: {  }

以及UserRole反向yaml配置:

Rep\Bundle\ProjectBundle\Entity\UserRole:
    type: entity
    table: UserRole
    fields:
        id:
            id: true
            type: integer
            unsigned: true
            nullable: false
            generator:
                strategy: AUTO
        name:
            type: string
            length: 50
            fixed: false
            nullable: false
    manyToMany:
        users:
            targetEntity: User
            mappedBy: roles
    lifecycleCallbacks: {  }

这是用户表架构:

CREATE TABLE `User` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
  `salt` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

UserRole 表架构:

CREATE TABLE `UserRole` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

以及 UserRoleLookup 架构:

CREATE TABLE `UserRoleLookup` (
  `user_id` int(11) unsigned NOT NULL,
  `user_role_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`user_id`,`user_role_id`),
  KEY `user_role_id` (`user_role_id`),
  CONSTRAINT `userrolelookup_ibfk_2` FOREIGN KEY (`user_role_id`) REFERENCES `userrole` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `userrolelookup_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如您所见,这是一个非常简单的设置,使用查找表来指示用户的角色或给定用户角色中的用户集。但是,我收到了这个令人沮丧的同步错误。我在这里或网上没有读到任何简明扼要地回答这个问题的东西,我希望有人能澄清我是否可以安全地离开这个配置并忽略这个错误?

【问题讨论】:

    标签: symfony doctrine doctrine-orm yaml


    【解决方案1】:

    运行此命令以显示 SQL 中的差异,而无需转储您的数据库:

    php bin/console doctrine:schema:update --dump-sql

    您还可以运行以下命令来执行更改:

    php bin/console doctrine:schema:update --force --full-database

    对于 symfony2 是

    php app/console doctrine:schema:update --force --full-database

    【讨论】:

    • 好主意。它对我有用。当然命令是“orm:schema:update”,以防你使用 zf2 和教义/doctrine-orm-module
    • 这会给出错误“'--full-database' 选项不存在。” (Symfony 2.8.1)
    • 貌似改名为-complete:github.com/doctrine/doctrine2/blob/…
    • 只是要指出:请注意,控制台在 symfony 3.* 上的 bin 目录内:$php bin/console dictionary:schema:update --force --complete
    • 多么没用的命令,不显示遇到的错误。 :(
    【解决方案2】:

    对于 Symfony3:

    app/console改为bin/console--full-database--complete

    所以最后的命令是:

    php bin/console doctrine:schema:update --force --complete --dump-sql
    

    【讨论】:

      【解决方案3】:

      这很简单:某些字段或关系或实体等尚未转换为数据库架构中的列或表。更新你的架构,你会没事的。

      【讨论】:

      • 我转储了当前表并使用 symfony2 控制台原则命令重新生成了它们,并且验证阶段通过了。除了未签名的 id 字段被签名之外,架构几乎没有什么不同,这很愚蠢 - 但至少我的错误消失了。
      • 这并不完全正确,例如,当将错误的属性与注释混合时,您可能会遇到此错误。
      • @COil 在这种情况下,[Mapping] 的行是红色的,对吧?不符合[Database]
      【解决方案4】:

      对于对此感兴趣的任何人,重新生成我的表架构会产生以下查找架构:

      CREATE TABLE `UserRoleLookup` (
        `user_id` int(11) NOT NULL,
        `user_role_id` int(11) NOT NULL,
        PRIMARY KEY (`user_id`,`user_role_id`),
        KEY `IDX_4511E771A76ED395` (`user_id`),
        KEY `IDX_4511E7718E0E3CA6` (`user_role_id`),
        CONSTRAINT `FK_4511E7718E0E3CA6` FOREIGN KEY (`user_role_id`) REFERENCES `UserRole` (`id`),
        CONSTRAINT `FK_4511E771A76ED395` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\
      

      我猜 symfony2-doctrine 包不是无符号整数的忠实拥护者,因为我可以看到我发布的架构几乎没有变化。总之,问题解决了。

      【讨论】:

      • 你将不得不手动添加无符号整数......如果你有很多实体,那就太糟糕了,希望他们会考虑我们其他人使用无符号整数
      【解决方案5】:

      我也有同样的问题。此外,在运行时

      php bin/console doctrine:schema:update --dump-sql
      

      无论我是否已经执行了 sql,它总是会显示相同的 sql。看起来上面的命令未能检测到数据库模式和当前实体元数据之间的真正区别。我还验证了这些问题是否与您使用的数据库有关。 因为我至少在 MySQL 5.7.25 中没有这样的问题,但在 MariaDB 10.2.24 中。查看此处了解更多信息:https://github.com/symfony/symfony/issues/27166#issue-320494745

      附: MariaDB 给我带来了其他麻烦,例如“索引键长度 767 字节”。不要说它不好。但是提醒我 3 年前我第一次决定使用 MariaDB 时,帖子/新闻说它与刚刚被 Oracle 收购的 MySQL 相比有多好。还有消息说 MySQL 会有所不同,然后是恐慌......(只是个人意见)

      【讨论】:

        【解决方案6】:

        如果您正在运行这些命令:

        php bin/console doctrine:schema:update --force --complete --dump-sql
        

        并且生成的 SQL 不会创建新实体(没有 CREATE TABLE),您最好检查一下您的映射是否正常。就我而言,我忘了把它放在映射中:

         * @ORM\Entity
        

        【讨论】:

          【解决方案7】:

          php bin/console 学说:schema:update --dump-sql 它可能解决了我的问题

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          • 2013-03-29
          • 1970-01-01
          相关资源
          最近更新 更多