PostgreSQL“数据库不存在”,但确实存在

时间:2018-11-08 23:10:44

标签: database postgresql rake

几天来我一直在尝试在PostgreSQL中创建数据库,遇到了一些问题,但是似乎卡住了。

我在PostgreSQL中手动创建了一个名为postgres_development的数据库,因为bundle exec rake db:create无法正常工作。

现在,我正在尝试运行bundle exec rake db:migrate,但无法识别我有一个名为postgres_development的数据库。

Error Message

这是我的Rakefile。

require 'rake'
require 'rspec/core/rake_task'
require 'active_support'
require 'active_support/core_ext'

require_relative 'config'

namespace :db do
  desc "Drop, create, and migrate the database"
  task :reset => [:drop, :create, :migrate]

  desc "Create #{APP_NAME} databases"
  task "create" do
    puts "Creating #{APP_NAME} development and test databases if they don't exist..."
    system("@SET PGPASSWORD=#{DB_PASSWORD}; createdb --username=#{DB_USERNAME} --password=#{DB_PASSWORD} #{DB_NAME} && @SET PGPASSWORD=#{DB_PASSWORD}; createdb --username=#{DB_USERNAME} --password=#{DB_PASSWORD} #{TEST_DB_NAME}")
  end

  desc "Drop #{APP_NAME} databases"
  task "drop" do
    puts "Dropping #{APP_NAME} development and test databases..."
    system("dropdb #{DB_NAME} && dropdb #{TEST_DB_NAME}_test")
  end

  desc "Migrate the database"
  task "migrate" do
    ActiveRecord::Migrator.migrations_paths << File.dirname(__FILE__) + 'db/migrate'
    ActiveRecord::Migration.verbose = true
    ActiveRecord::MigrationContext.new("/db/migrate/").migrate
  end

  desc "Populate the database with sample data"
  task "seed" do
    require APP_ROOT.join('db', 'seeds.rb')
  end
end

namespace :generate do
  desc "Create a database migration\n rake generate:migration NAME=create_people"
  task :migration do
    unless ENV.has_key?('NAME')
      raise "Must specify NAME for migration, e.g. rake generate:migration NAME=create_people"
    end

    migration_name = ENV['NAME']
    class_name = migration_name.camelize
    timestamp = Time.now.strftime('%Y%m%d%H%M%S')
    filename = "#{timestamp}_#{migration_name}.rb"
    path = APP_ROOT.join('db', 'migrate', filename)

    if File.exist?(path)
      raise "ERROR! File '#{path}' already exists"
    end

    puts "Creating migration at #{path}"
    File.open(path, 'w+') do |f|
      f.write("class #{class_name} < ActiveRecord::Migration\n\tdef change\n\n\tend\nend")
    end
  end
end

desc 'Start IRB with application environment loaded'
task "console" do
  exec "irb -r./config"
end

desc "Run the specs"
RSpec::Core::RakeTask.new(:spec)
task :default  => :specs

# Will this not work?
#desc "Run the specs"
#task 'specs' do
#  exec "rspec spec"
#end

这是我的config.rb在同一文件夹postgres中,我从activerecord-template重命名,但尝试将其连接到数据库失败。

require 'pathname'
require 'pg'
require 'active_record'
require 'logger'

## Load all files and configure the db

APP_ROOT = Pathname.new(File.expand_path(File.dirname(__FILE__)))

APP_NAME = APP_ROOT.basename.to_s

DB_PATH  = APP_ROOT.join('db', APP_NAME + "_development.db").to_s

DB_NAME = APP_NAME + "_development.db"

TEST_DB_NAME = APP_NAME + "_test.db"

DB_USERNAME = 'postgres'

DB_PASSWORD = '****'

if ENV['DEBUG']
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end


Dir[APP_ROOT.join('models', '*.rb')].each do |model_file|
  filename = File.basename(model_file).gsub('.rb', '')
  autoload ActiveSupport::Inflector.camelize(filename), model_file
end

ActiveRecord::Base.establish_connection :adapter  => 'postgresql',
                                        :database => DB_NAME,
                                        :host => 'localhost',
                                        :username => DB_USERNAME,
                                        :password => DB_PASSWORD

任何对这里发生的事情的想法将不胜感激!

2 个答案:

答案 0 :(得分:0)

这似乎很明显:您创建了一个数据库postgres_development,然后尝试连接到另一个名称为postgres_development.db的数据库。

那应该如何工作?

答案 1 :(得分:0)

  1. 在第28行的Rakefile中,在.前面添加一个/,即将其更改为ActiveRecord::MigrationContext.new("./db/migrate/").migrate

  2. db/migrate/20181108113458_create_people.rb在第一行的末尾添加一个[4.2]。将其更改为class CreatePeople < ActiveRecord::Migration[4.2]