【问题标题】:Symfony doctrine:schema:update not workingSymfony 学说:模式:更新不起作用
【发布时间】:2013-11-11 02:25:37
【问题描述】:

我有一个奇怪的问题: 我有一个应用程序 symfony 2.3(带有奏鸣曲用户) 我创建了一个包含一个实体的捆绑包 - 该实体的创建没有问题 然后我不得不修改实体,现在似乎无法修改架构:

为了看看会发生什么,我用 +1 增加了所有字符串的长度

实体代码(带注释):

namespace Too\ConfigAppBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * ConfigApp
 *
 * @ORM\Table(name="ConfigApp")
 * @ORM\Entity(repositoryClass="Too\ConfigAppBundle\Entity\ActiviteRepository")
 */
class ConfigApp
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $nom
     *
     * @ORM\Column(name="nom", type="string", length=101, unique=true)
     */
    private $nom;

    /**
     * @var string $nomSlug
     *
     * @Gedmo\Slug(fields={"nom"}, updatable=true, separator="_")
     * @ORM\Column(name="nomSlug", type="string", length=101, nullable=true)
     */
    private $nomSlug;

    /**
     * @var string $email
     *
     * @ORM\Column(name="email", type="string", length=151)
     */
    private $email;

    /**
     * @var string $telephone
     *
     * @ORM\Column(name="telephone", type="string", length=16)
     */
    private $telephone;

    /**
     * @var datetime $cree_le
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="cree_le", type="datetime")
     */
    private $cree_le;

    /**
     * @var datetime $modifie_le
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="modifie_le", type="datetime")
     */
    private $modifie_le;

    ...

现在看看结果:

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

CREATE TABLE ConfigApp (id INT AUTO_INCREMENT NOT NULL, nom VARCHAR(100) NOT NULL, nomSlug VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL, telephone VARCHAR(15) NOT NULL, cree_le DATETIME NOT NULL, modifie_le DATETIME NOT NULL, PRIMARYKEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB

没有考虑新的长度: 例如字段 nom 应该有长度=101, 但是 dump-sql 给出了 nom VARCHAR(100) !

任何人都可以尝试找出问题所在吗? 谢谢!

编辑: 我之前尝试使用以下命令清除缓存: * php 应用程序/控制台原则:缓存:清除元数据 * php 应用程序/控制台缓存:清除 * 通过删除缓存文件夹中的所有内容

我也试过 --dump-sql 和 --force。

这根本没有改变。 欢迎任何提示!

【问题讨论】:

  • 我会尝试清除元数据缓存。我认为是doctrine:cache:clear-metadata。只需运行 app/console 即可查看命令列表

标签: php symfony doctrine-orm


【解决方案1】:

我刚刚遇到了完全相同的问题:架构没有更新。

请注意,--force 返回的内容与--dump-sql 完全相同,唯一的区别是--force 针对数据库运行SQL。

尽管在我的情况下,问题不是因为 .orm.xml 文件。这是因为我在 config_dev.xml 中设置了这个:

doctrine:
orm:
    metadata_cache_driver:
        type: memcached
        host: localhost
        port: 11211
        instance_class: Memcached
    query_cache_driver:
        type: memcached
        host: localhost
        port: 11211
        instance_class: Memcached
    result_cache_driver:
        type: memcached
        host: localhost
        port: 11211
        instance_class: Memcached

即使我经常发出拯救:

php app/console cache:clear

memcached 数据未刷新。所以我不得不重新启动 memcached,然后一切都重新启动并运行!

感谢您的提问,它让我找到了适合我的地方。

更新:正如上面 Phil 所建议的,运行此命令也可以解决问题:

php app/console doctrine:cache:clear-metadata

【讨论】:

    【解决方案2】:

    您可能忘记启用 Doctrine 自动映射;

    orm:
       #auto_mapping: true
    

    如果自动映射被禁用(或如上注释),您应该手动注册每个包的实体。

    orm:
       entity_managers:
          default:
             mappings:
                AcmeHelloBundle: ~
    

    【讨论】:

      【解决方案3】:

      运行时尽量使用YAML而不是默认注解

      php app/console doctrine:generate:entity
      

      或者代替运行

      app/console doctrine:schema:update --force
      

      您可以手动创建 MySql 表,这是一项非常繁琐的任务

      【讨论】:

        【解决方案4】:

        我找到了解决方案: 我以前没有看到,但是 src\Too\ConfigAppBundle\Resources\config 中有一个学说文件夹,其中包含一个名为 ConfigApp.orm.yml 的文件:

        Too\ConfigAppBundle\Entity\ConfigApp:
            type: entity
            table: null
            repositoryClass: Too\ConfigAppBundle\Entity\ConfigAppRepository
            fields:
                id:
                    type: integer
                    id: true
                    generator:
                        strategy: AUTO
                nom:
                    type: string
                    length: '100'
                nomSlug:
                    type: string
                    length: '100'
                email:
                    type: string
                    length: '150'
                telephone:
                    type: string
                    length: '15'
                cree_le:
                    type: datetime
                    length: null
                modifie_le:
                    type: datetime
                    length: null
            lifecycleCallbacks: {  }
        

        我删除了这个文件夹,现在又可以更新架构了。

        我确实做了一些事情来生成这个学说文件夹,但我不知道它是什么 - 如果有人能告诉我这些东西是如何生成的 - 为什么?

        【讨论】:

          【解决方案5】:

          虽然@rai和其他人给出的一些答案是正确的,但是对于Symfony版本等于或高于3.0的另外一个建议请使用bin/console而不是app/console,如下所示,

          bin/console doctrine:schema:update --force
          

          【讨论】:

            【解决方案6】:

            我认为这是因为教义:映射:导入命令。此命令将现有数据库的模式存储到 .orm.xml 文件中。可能你执行了这个命令。

            我遇到了同样的问题,花了很多时间来找出答案。

            【讨论】:

              【解决方案7】:

              因为我使用的是.orm.yml-mapping,所以我在创建doctrine-文件夹时遇到了问题,其中yml 映射存在于错误的路径下,因此我通过移动@987654324 来修复它@-文件夹到config 文件夹: ...\BundleName\Resources\config\doctrine\MyEntity.orm.yml

              【讨论】:

              • 投反对票的人能否评论一下你投反对票的原因?当然,这不是问题的答案,但我只是添加了一种可能的解决方案,有人在寻找答案时可能会忘记......
              【解决方案8】:

              试试

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

              这是使用实体更新您的数据库架构

              【讨论】:

              • 它没有多大帮助,因为它转储的信息与 --dump-sql 完全相同
              【解决方案9】:

              在 CLI 中键入 php app/console help doctrine:schema:update

               --dump-sql            Dumps the generated SQL statements to the screen (does no
              t execute them).
              
              ...
              
               --force               Causes the generated SQL statements to be physically exec
              uted against your database.
              

              所以试试--force 而不是--dump-sql

              这里是清除缓存的命令:

              php app/console cache:clear
              

              不要忘记在命令命名空间之前使用 help 关键字,以便获取该命令的帮助消息。

              希望对你有帮助

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-09-25
                • 1970-01-01
                • 1970-01-01
                • 2011-04-29
                • 1970-01-01
                相关资源
                最近更新 更多