为什么rake db:migrate有时会向structure.sql添加尾随空格?

时间:2012-11-15 09:01:14

标签: ruby-on-rails postgresql

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

任何人都知道该怎么办?空白从哪里来?它与PostgreSQL有关还是别的什么?

6 个答案:

答案 0 :(得分:9)

这是一个可以提交版本控制的解决方案:将尾随空格修剪为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任务之后运行。

答案 1 :(得分:7)

我刚为此设置了一个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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这是因为每台计算机上数据库的版本差异。

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-2)

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

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

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