【问题标题】:Symfony/Doctrine Rearranging Database ColumnsSymfony/Doctrine 重新排列数据库列
【发布时间】:2013-11-28 17:04:10
【问题描述】:

当我使用教义:模式:更新命令行生成表时,似乎 Doctrine(或 Symfony?)想要输入一个重新排列我的列的命令,将键放在它会出现的前面。我想知道是否,更有希望,我可以在哪里禁用环境的这个“功能”,所以当我去生成我的表时,它们会按照我输入到 orm 中的顺序保存。

我已经四处寻找这个问题,但似乎没有其他人能够根据我的能力提出这个问题,而且我不确定我需要 Doctrine 或 Symfony 的哪个捆绑包/部分改变它不想重新排列我的桌子。任何关于捆绑包的哪一部分将包含此逻辑,或者我可以添加什么选项来改变它的任何信息都将不胜感激,因为到目前为止我无法在文档中真正找到任何内容。

更新: 我做了一些调查,发现了一个与我类似的溢出问题,但不完全是。就我而言,我没有使用新的数据类型,唯一向前移动的列是我指定为键的列(主键或外键)。它给我的命令看起来与此非常相似,除了它对我的每一个键都执行此操作。

ALTER TABLE product_price CHANGE price price DECIMAL(10,2) DEFAULT NULL

Doctrine custom type always altering table

更新 2: 应要求提供的其他信息: 以 .orm.yml 格式运行 MySQL。

它想要设置的字段始终是关键字段,并且在我将它们更改回我想要/需要它们的顺序之后,它会觉得每次都需要重新排列列。

我不会更改有关字段的任何内容;它在初始创建时以及每当我需要运行架构更新时都会执行此操作,而无需对这些特定字段进行任何更改。

【问题讨论】:

  • 我从未见过坚持重新排列我的专栏的教义。您使用的是什么 DBMS 和版本?列和属性映射之间的某些细节是否可能不同,例如,如果您更改了精度、可空性或默认值?
  • 在您运行 ALTER TABLE 语句后是否学说:schema:update 停止抱怨,或者它是否一遍又一遍地建议相同的 SQL 语句。您的映射配置是什么(注释或 .yml 结构)。简而言之:需要更多信息才能了解您的情况。 ;-)
  • 在主要问题中添加了更多信息,希望现在已经足够了,如果没有,请告诉我还需要什么,我会添加我可以添加的内容。

标签: php mysql symfony doctrine-orm


【解决方案1】:

我做了一些挖掘工作,我认为你无法控制它。见 getColumns() [1] [2]

由此判断,依次是PK、FK、其他列。 扫描原始逻辑页面很困难,所以我可能遗漏了一些东西,但据我所知,它并没有根据任何配置来决定顺序。

[1](回答时;2013 年 11 月)https://github.com/doctrine/dbal/blob/5ffb052a2e622908c988f79e9a099f5d64f40b34/lib/Doctrine/DBAL/Schema/Table.php#L555

[2](更新的行号;2020 年 6 月)https://github.com/doctrine/dbal/blob/2.10.x/lib/Doctrine/DBAL/Schema/Table.php#L595

【讨论】:

  • 我不确定这是否是问题所在,因为问题源于 Doctrine 添加了一个 ALTER TABLE CHANGE ...,而我没有在此类中看不到任何类似的行。碰巧我错过了你链接的内容吗?
  • 您可能想看看平台特定的类。它们是编译 SQL 的地方。
  • 我认为你的答案结合起来就是问题所在。在我看来,它试图将我的主键作为我的第一列,外来作为第二列,然后它让其他列随心所欲地出现。问题在于 dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php 中的 getAlterTableSQL() 函数必须调用您在某些时候提到的 getColumns,注意我的表不是它想要的顺序,然后尝试根据它想要的内容重新排列它们。
  • 您是说列顺序与实体属性的顺序不同,还是架构更新正在改变现有数据库架构的顺序?
  • 列顺序与 ORM 中的不同。它似乎按照我指定的顺序创建它们,然后在它遇到并添加它似乎的索引之后,它会将列重新排序为它想要的,即 PK,然后是 FK,然后是一般索引。
【解决方案2】:

我认为您应该在生产中使用其中一种方法

  • 运行 app/console dictionary:schema:update --dump-sql 并手动运行 sql
  • 使用 DoctrineMigrationBundle 或类似的迁移 Liquibase

【讨论】:

  • 我已经得出了做其中一个的结论,但我更感兴趣的是某种推理/理性,为什么我需要这样做,以及为什么 Doctrine 希望改变我的数据库的布局开始。并且,希望还有另一种方法可以设置选项以使其不执行此操作。不过,我确实很感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2018-03-23
相关资源
最近更新 更多