Cloud9 - Rails |将数据库从SQLite3更改为PostgreSQL

时间:2016-07-16 08:01:13

标签: ruby-on-rails postgresql sqlite cloud9-ide cloud9

我正在使用 ruby​​ 2.3.0p0 Rails 4.2.4 cloud 9 上,我想将我的数据库从SQLite3更改为PostgreSQL。

我有关于sqlite3的一些数据。

# config/database.yml
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3
test:
  <<: *default
  database: db/test.sqlite3
production:
  <<: *default
  database: db/production.sqlite3

我尝试了点击 gem,它要求输入用户名和密码,我不知道在哪里可以找到这些凭据。

这个问题还有其他解决办法吗?

2 个答案:

答案 0 :(得分:2)

首先你必须检查postgresql是否正在运行,如果你必须启动它然后运行:

$ sudo service postgresql start

进入交互式postgresql终端psql:

$ sudo sudo -u postgres psql

创建用户并提供其密码,然后退出psql:

postgres=# CREATE USER username SUPERUSER PASSWORD 'password';
postgres=# \q

创建env变量,将它们放在config.yml文件中,将它们导出到〜/ .profile文件中:

$ echo "export USERNAME=username" >> ~/.profile
$ echo "export PASSWORD=password" >> ~/.profile

然后从postgresql更新template1:​​

$ sudo sudo -u postgres psql
postgres# UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
postgres# DROP DATABASE template1;
postgres# CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';
postgres# UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
postgres# \c template1

收集垃圾并分析运行VACUUM的数据库:

postgres# VACUUM FREEZE;
postgres# \q

现在更新您的配置文件,以使其内容与之前的内容一致:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host:     <%= ENV['IP'] %>

development:
  <<: *default
  database: app_development

test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production

检查是否安装了pg gem,如果没有,则运行,然后将其添加到Gemfile中,然后将其捆绑:

gem install pg
bundle install

如果您的数据库仍未创建和/或您收到以下消息:

ActiveRecord::NoDatabaseError: FATAL:  database "<project_name>_development" does not exist

然后运行适当的命令来创建它:

rake db:create

要测试一切是否正常运行,请尝试生成一个简单的脚手架:

rails g scaffold Post title content:text

要将此迁移及其内容保留到数据库,请运行migrate命令:

rake db:migrate

现在,如果你取得了成功,一切都应该没有问题,你可以运行:

rails console

在数据库中创建一条新记录:

Post.create title: 'Number one', content: 'Lorem Ipsum' 

继续编码并享受乐趣。

注意:如果您尝试过以下错误:

PG::ConnectionBad: fe_sendauth: no password supplied

然后检查你的env变量是否正常,如果错误仍然存​​在,你可以将名称和密码“硬编码”到config.yml文件,虽然不建议这样做,所以,你最好避免这种情况。解决方案'在最坏的情况下。

答案 1 :(得分:0)

您的database.yml文件应与postgres相似:

default: &default
  adapter: postgresql
  user: username
  password: *****
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: myrubyblogdev

test:
  <<: *default
  database: myrubyblogtest

此外,在gemfile中添加gem 'pg'

对于sqlite数据库中包含的数据,您可以创建rake任务以将数据传输到新创建的postgres数据库。