在我们的一些开发人员机器上rake db:migrate
添加了尾随空格,structure.sql
这真的很烦人,因为每次对数据库进行更改时,我们都必须首先从文件中删除所有尾随空格。
任何人都知道这可能是怎么回事?空白从哪里来?它与PostgreSQL有关还是其他?
在我们的一些开发人员机器上rake db:migrate
添加了尾随空格,structure.sql
这真的很烦人,因为每次对数据库进行更改时,我们都必须首先从文件中删除所有尾随空格。
任何人都知道这可能是怎么回事?空白从哪里来?它与PostgreSQL有关还是其他?
这是您可以提交给版本控制的解决方案:将尾随空格修剪为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
任务之后立即运行的钩子。
我只是为此设置了一个 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 的更多信息,请参阅有关 gitattributes 的文档filters
。
遇到同样的问题,我通过a添加了有实际效果的更改git add -i db/structure.sql
然后git checkout db/structure.sql
省略了空格的差异。
我们在团队中考虑的替代方案是使用另一个 gem 来跟踪数据库。
这是我一生中最美好的一天,也许是你的:
在PG 11中,此错误不再存在,因为Tablespace
未写入转储。因此,您可以升级您的 PG 版本并摆脱删除空间的钩子。
发生这种情况是因为每台机器上的数据库版本不同。
您可以都拥有相同的版本,或者在您的文本编辑器中让它在保存时修剪尾随空格。在崇高的将此行添加到您的设置中:
"trim_trailing_white_space_on_save": true
我在我的一个项目中使用了这个 gem,它完成了这项工作。
https://github.com/jakeonrails/fix-db-schema-conflicts
当你运行rake db:migrate
它时,它会运行一些好东西;其中之一是sed
删除不必要的空格的命令。