PostgreSQL "Database does not exist" but it does

Viewed 3305

I have been trying to create a database in PostgreSQL for several days and have run into several issues but seem to be stuck.

I have manually created a database in PostgreSQL called postgres_development because bundle exec rake db:create wasn't working.

Now, I am trying to run bundle exec rake db:migrate but it is not recognizing that I have a database called postgres_development.

Error Message

This is my 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

And this is my config.rb in the same folder, postgres which I renamed from activerecord-template in a failed attempt to get it to connect to my database.

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

Any thoughts on what is going on here would be greatly appreciated!

2 Answers

That seems obvious: You created a database postgres_development, then you try to connect to a database with a different name, namely postgres_development.db.

How is that supposed to work?

  1. in your Rakefile in line 28, add a . in front of the /, i.e. changing it to ActiveRecord::MigrationContext.new("./db/migrate/").migrate

  2. db/migrate/20181108113458_create_people.rb add a [4.2] at the end of the first line ie. changing it to class CreatePeople < ActiveRecord::Migration[4.2]

Related