在PostgreSQL / Rails 3.2下,运行rake db:structure:dump失败

4
我收到了以下错误信息:
pg_dump:太多的命令行参数(第一个是“demo_db”)
尝试“pg_dump --help”以获得更多信息。
rake中止!
数据库转储错误
任务:TOP => db:structure:dump (通过使用--trace运行任务查看完整跟踪)
在Rails 3.1下这个命令可以工作,但是我现在使用的是Rails 3.2.3和PostgreSQL 9.0.5。其他任务如db:migrate或db:rollback都正常工作。

请查看此处的答案:https://dev59.com/cmct5IYBdhLWcg3wAo-H#13733565 - John Bachir
John,谢谢你,但我的问题不同。请参见我的已接受的解决方案。 - Ortwin Gentz
4个回答

7

pg_dump 命令在 activerecord/lib/active_record/railties/databases.rake 的第 428 行执行。

`pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(config['database'])}`

尝试在那里设置断点,查看实际运行的命令。
所有这些选项都适用于Pg9.0.x,因此我怀疑abcs[Rails.env]['schema_search_path']中有一些奇怪的东西会混淆psql的选项解析。请注意,search_path构造不引用--schema参数,因此具有嵌入空格的search_path_part将解析为部分模式名称,后面跟着一个单词,该单词没有前缀选项,因此psql将其解释为数据库名称,然后在后面到达真正的数据库名称时抱怨。

谢谢,使用这种技术我找到了错误(文件名周围缺少单引号)。请查看我的回复。 - Ortwin Gentz

5

感谢dbenhur帮我找到了问题所在。我的文件名路径中有一个空格。 将activerecord/lib/active_record/railties/databases.rake的第392行更改为:

pg_dump -i -s -x -O -f '#{filename}' #{search_path} #{abcs[Rails.env]['database']}

#{filename}周围添加单引号可以解决该问题。


@KonstantinGredeskoul 最新的源代码在文件名和数据库名称上使用了Shellwords.escape,但是奇怪的是没有在search_path上使用; 所以现在更好了。虽然通常使用带有数组参数的Open3::capture2比[`Kernel::``](http://www.ruby-doc.org/core-2.0/Kernel.html#method-i-60)更安全。 - dbenhur
谢谢,我已经为给定的字符串进行了研究。对我来说它不起作用,因为Spring环境中的PATH没有包含到pg_dump的路径。 - Евгений Масленков

1
我在我的设置中遇到了与db:structure:dump类似的问题。Rails 3.2.11 + JRuby 1.7.1[1.8模式] Postgresql 9.1.7。
唯一真正有用的是将activerecord_jdbc_adapter从版本1.2.5降级到1.2.2。
gem 'activerecord-jdbc-adapter', '1.2.2'
gem "activerecord-jdbcpostgresql-adapter", '1.2.2'

希望它能帮助任何人。

0
我通过创建一个新的应用程序并将数据库设置为postgresql(rails new MyApp -d postgresql),然后将所有旧应用程序文件(/app文件夹、迁移和一些/config文件)移动到新应用程序中来解决了这个(黑暗)问题。现在当我运行rake db:migrate时,就不会出现pg_dump错误了。希望这能帮助到某些人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接