【问题标题】:Why does rake db:migrate sometimes add trailing whitespace to structure.sql?为什么 rake db:migrate 有时会在 structure.sql 中添加尾随空格?
【发布时间】:2012-11-15 09:01:14
【问题描述】:

在我们的一些开发人员机器上,rake db:migrate 将尾随空格添加到 structure.sql,这真的很烦人,因为每次对数据库进行更改时,我们都必须首先从文件中删除所有尾随空格。

有人知道这会是什么情况吗?空白从哪里来?它与PostgreSQL有关还是其他什么?

【问题讨论】:

  • 我也遇到这种情况,太烦人了
  • 你发现这个问题了吗?
  • 不幸的是,我们从未找到问题的根源@DickieBoy
  • 你们是不是也有NOT NULLS出现和消失的问题?
  • 是的!一直很烦人

标签: ruby-on-rails postgresql


【解决方案1】:

这是一个您可以提交到版本控制的解决方案:将尾随空格修剪为 db:migrate 钩子。

lib/tasks/db.rake:

namespace :db do
  def remove_whitespace_in_structure
    if Rails.env.development?
      `sed -i '' -e's/[[:space:]]*$//' db/structure.sql`
    end
  end

  task :migrate do
    remove_whitespace_in_structure
  end
end

上面的代码看起来像是覆盖了db:migrate,但它是一个在正常的db:migrate 任务之后运行的钩子。

【讨论】:

  • 使用这个方案的好处是文件被提前清理了。使用 .gitattributes 方法,如果您在提交之前查看文件系统,您将看到包含所有额外空格的文件。
  • 绝妙的答案。值得注意的是,我发现我还必须为db:test:prepare 编写类似的任务,这似乎也会生成structure.sql
【解决方案2】:

我刚刚为此设置了一个 git 过滤器。不幸的是,这不是您可以添加到存储库中的东西;每个团队成员都必须进行设置。

.gitconfig(或.git/config)中

[filter "remove-trailing-whitespace"]
  clean = sed -E 's/[[:space:]]*$//'
  smudge = cat

.gitattributes.git/info/attributes

db/structure.sql filter=remove-trailing-whitespace

有关 git filters 的更多信息,请参阅 documentation on gitattributes

【讨论】:

  • 感谢分享!这可以通过在 bin 文件夹中创建一个实用程序脚本来轻松解决,该脚本作为引导新开发人员机器的一部分运行。
  • 我在 .git/info/attributes 而不是 .gitattributes 中添加了过滤器属性,并且也取得了成功。谢谢。
  • @voxobscuro:我已经更新了我的答案以包括.git/info/attributes。谢谢:)
  • 有一个git 依赖?
【解决方案3】:

这是我一生中最美好的一天,也许是你的:

PG 11 中,此错误不再存在,因为 Tablespace 未写入转储。所以你可以升级你的PG版本,摆脱你删除空间的钩子。

【讨论】:

    【解决方案4】:

    遇到同样的问题,我通过git add -i db/structure.sql,然后git checkout db/structure.sql添加有实际效果的更改,这样空格的差异就省略了。

    我们团队考虑的替代方法是使用另一个 gem 来跟踪数据库。

    【讨论】:

    • 我不介意为我的下一个项目尝试数据映射器。
    【解决方案5】:

    发生这种情况是因为每台机器上的数据库版本不同。

    您可以拥有相同的版本,或者在您的文本编辑器中让它在保存时修剪尾随空格。 在崇高的将此行添加到您的设置中: "trim_trailing_white_space_on_save": true

    【讨论】:

      【解决方案6】:

      我在我的一个项目中使用了这个 gem,它完成了工作。

      https://github.com/jakeonrails/fix-db-schema-conflicts

      当您运行rake db:migrate 时,它会运行一些好东西;其中之一是 sed 命令删除不必要的空格。

      【讨论】:

      • 这个问题是关于structure.sql,而不是schema.rb。如果您可以删除您的答案,以便问题受到更多关注,我们将不胜感激,谢谢。
      猜你喜欢
      • 2011-08-10
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2015-11-18
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多