我有一个项目,目前使用旧版本的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
失败模式的工作,并且无法找到任何地方提到的这种特殊症状。
答案 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)