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

mhe*_*xon 27 postgresql ruby-on-rails

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

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

Cha*_*ran 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
Run Code Online (Sandbox Code Playgroud)

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

  • 使用此解决方案的优点是文件可以尽早清理.使用.gitattributes方法如果在提交之前查看文件系统,您将看到包含所有额外空格的文件. (3认同)
  • 精湛的答案.值得注意的是,我发现我还必须为`db:test:prepare`编写类似的任务,这似乎也会生成`structure.sql` (3认同)

Ami*_*tin 7

我只是为此设置了一个git过滤器.不幸的是,这不是你可以添加到回购的东西; 每个团队成员都必须进行设置.

.gitconfig(或.git/config)

[filter "remove-trailing-whitespace"]
  clean = sed -E 's/[[:space:]]*$//'
  smudge = cat
Run Code Online (Sandbox Code Playgroud)

.gitattributes.git/info/attributes

db/structure.sql filter=remove-trailing-whitespace
Run Code Online (Sandbox Code Playgroud)

有关git的更多信息,请参阅gitattributes上文档filters.


Uly*_* BN 1

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

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