PostgreSQL «База данных не существует», но она существует - PullRequest
0 голосов
/ 09 ноября 2018

Я пытался создать базу данных в PostgreSQL в течение нескольких дней и столкнулся с несколькими проблемами, но, похоже, застрял.

Я вручную создал базу данных в PostgreSQL под названием postgres_development, потому что bundle exec rake db:create не работал.

Сейчас я пытаюсь запустить bundle exec rake db:migrate, но он не распознает, что у меня есть база данных с именем postgres_development.

Error Message

Это мой рейкфайл.

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 голосов
/ 14 ноября 2018
  1. в вашем Rakefile в строке 28, добавьте . перед /, т.е. изменив его на ActiveRecord::MigrationContext.new("./db/migrate/").migrate

  2. db/migrate/20181108113458_create_people.rb добавить [4.2] в конце первой строки, т.е. изменив его на class CreatePeople < ActiveRecord::Migration[4.2]

0 голосов
/ 09 ноября 2018

Это кажется очевидным: вы создали базу данных postgres_development, затем пытаетесь подключиться к базе данных с другим именем, а именно postgres_development.db.

Как это должно работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...