rake db:schema:dump生成一个空模式

时间:2017-06-27 23:03:07

标签: ruby-on-rails rake

我有一个项目,目前使用旧版本的Ruby on Rails环境并使用PostgreSQL数据库。版本是(是的,我知道......不要笑,我现在必须支持这个旧版本):

ruby 1.8.7
rails 2.3.11
rake 10.5.0
psql 9.5.7

如果重要,这一切都安装在Ubuntu 16.04系统上。这一切都在我的旧系统上工作,最终死了。所以我在新机器上设置rvm和这些开发工具版本,并复制到数据库上。

在新机器上,除了我尝试过的几个rake数据库任务外,一切似乎都能正常工作。如果我运行,例如,rake db:schema:dump,我没有输出错误,我得到一个db/schema.rb文件,其中包含以下内容:

# This file is auto-generated from the current state of the database. Instead of editing this file,
# please use the migrations feature of Active Record to incrementally modify your database, and
# then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
# to create the application database on another system, you should be using db:schema:load, not running
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended to check this file into your version control system.

ActiveRecord::Schema.define(:version => 0) do

end

我尝试运行rake db:structure:dump并收到错误:

/usr/lib/postgresql/9.5/bin/pg_dump: invalid option -- 'i'
Try "pg_dump --help" for more information.
rake aborted!
Error dumping database
/home/mark/.rvm/gems/ruby-1.8.7-p374@caplus/gems/rails-2.3.11/lib/tasks/databases.rake:287
/home/mark/.rvm/gems/ruby-1.8.7-p374@caplus/bin/ruby_executable_hooks:15
Tasks: TOP => db:structure:dump
(See full trace by running task with --trace)

我主要担心的是无法转储架构。我不了解它是如何运行的,没有错误,但是没有生成架构。正如我最初提到的,该应用程序通过script/server正常运行。我也从控制台运行ActiveRecord::SchemaDumper.dump得到了完全相同的结果(我想这是预期的,因为那可能是rake任务的运行)。但是从控制台,我可以很好地检查任何模型和数据。它就在那里。

对架构文件为何空的任何想法?我希望以前有人见过这种现象。我已经完成了大量搜索rake db:schema:dump失败模式的工作,并且无法找到任何地方提到的这种特殊症状。

2 个答案:

答案 0 :(得分:1)

我做了一些挖掘并确定tables的{​​{1}}方法返回一个空列表,即使它与数据库有有效连接。适配器源位于:

PostgresqlAdapter

方法如下:

gems/activerecord-2.3.11/lib/active_record/connection_adapters/postgresql_adapter.rb

# Returns the list of all tables in the schema search path or a specified schema. def tables(name = nil) schemas = schema_search_path.split(/,/).map { |p| quote(p) }.join(',') query(<<-SQL, name).map { |row| row[0] } SELECT tablename FROM pg_tables WHERE schemaname IN (#{schemas}) SQL end 返回的字符串如schema_search_path。处理完毕后,前面的空白与&#34; public&#34;一起进行,因此查询正在检查模式名称为"\"$user\", public""\"$user\""的模式。它与" public"的架构名称不匹配。

我刚刚修改了代码,现在我的"public"工作正常:

rake db:schema:dump

我怀疑这是一个更好的方法来解决问题,但这对我来说是可靠的。更不用说在这一点上,我使用的版本是如此古老或许其他人不关心。我确实看过 schemas = schema_search_path.split(/,/).map { |p| quote(p.strip) }.join(',') 的后期实现,但它们有点不同。

答案 1 :(得分:-1)

我认为postgresql 9.5会导致问题。请降级postgresql。

在rails github页面中已经报告了此行为 :Ref

我希望这会对你有所帮助。

干杯