数据库故障 - 数据库模式与当前映射文件不同步

时间:2012-12-02 15:01:37

标签: symfony doctrine doctrine-orm yaml

任何人都可以解释以下doctrine架构验证错误消息:

The error message returned by the schema validate function

以下是manyToMany关系中每个实体的yaml ORM定义,与documentation的第5.9节内联创建。<​​/ p>

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;

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

7 个答案:

答案 0 :(得分:24)

运行此命令以显示SQL中的差异,而不必转储db:

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

for Symfony3:

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

所以最后的命令是:

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

答案 3 :(得分:3)

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

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包不是无符号整数的忠实粉丝,因为我看到我发布的模式几乎没有变化。无论如何,问题解决了。

答案 4 :(得分:0)

php bin / console doctrine:schema:update --dump-sql它可能是它修复了我的问题

答案 5 :(得分:0)

我有同样的问题。此外,跑步时

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

P.S。 MariaDB给我造成了其他麻烦,例如“索引键长度767个字节”。并不意味着这很糟糕。但是请记住,三年前我第一次决定使用MariaDB时,有消息/新闻说它与刚被Oracle收购的MySQL相比有多好。还有消息说MySQL将会有所不同,然后出现恐慌……(只是个人观点)

答案 6 :(得分:0)

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

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

,并且生成的SQL不会创建新的实体(没有CREATE TABLE),因此最好检查映射是否正确。就我而言,我忘记将其放在映射中:

 * @ORM\Entity