在新的Rails项目中从SQLite更改为PostgreSQL

Vas*_*rth 122 database sqlite postgresql ruby-on-rails heroku

我有一个rails应用程序,其数据库在SQLite(开发和生产).由于我要转移到heroku,我想将我的数据库转换为PostgreSQL.

无论如何,我听说本地的开发数据库不需要从SQLite更改,所以我不需要改变它,但是,如何将生产环境从SQLite更改为PostgreSQL?

有没有人曾经这样做过,可以帮忙吗?

PS我不确定这个过程到底是什么,但我听说过将数据库从SQLite迁移到PostgreSQL,需要做什么?

Chr*_*tto 99

您可以将database.yml更改为此而不是使用开箱即用的sqlite:

development:
  adapter: postgresql
  encoding: utf8
  database: project_development
  pool: 5
  username: 
  password:

test: &TEST
  adapter: postgresql
  encoding: utf8
  database: project_test
  pool: 5
  username: 
  password:

production:
  adapter: postgresql
  encoding: utf8
  database: project_production
  pool: 5
  username: 
  password:

cucumber:
  <<: *TEST
Run Code Online (Sandbox Code Playgroud)

  • 您可以随意命名.如果您的项目名称是"计算器",我会将它们命名为calculator_production,calculator_test,calculator_development (5认同)
  • @mmichael它真的取决于你如何设置你的postgres.使用postgres.app,brew或native如果您使用的是MacOS X Lion +,则对其默认设置有不同的限制.因此,如果用户名和密码不适用,您可以将其保留,或者不使用任何值.这只是一种"捕获所有"类型的配置. (2认同)
  • 什么是'&TEST'在那里做(第9行)? (2认同)
  • "&TEST"将TEST设置为默认选项集.它们以后可以被覆盖或者被遗漏."<<:*TEST"是访问默认@DavidRhoden的方法 (2认同)

ard*_*igh 44

以下步骤对我有用.它使用了由Heroku创建并在Ryan Bates的Railscast#342中提到的水龙头宝石.有几个步骤,但它工作得很好(即使日期已正确迁移),它比Oracle - > DB2或SQL Server - >我过去做过的Oracle迁移要容易得多.

请注意,SQLite没有用户ID或密码,但是taps gem需要一些东西.我刚刚使用了文字"user"和"password".

为新数据库创建Postgres数据库用户

$ createuser f3
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y
Run Code Online (Sandbox Code Playgroud)

编辑 - 下面更新的命令 - 改为使用它

$ createuser f3 -d -s
Run Code Online (Sandbox Code Playgroud)

创建所需的数据库

$ createdb -Of3 -Eutf8 f3_development
$ createdb -Of3 -Eutf8 f3_test
Run Code Online (Sandbox Code Playgroud)

更新Gemfile

gem 'sqlite3'
gem 'pg'
gem 'taps'
$ bundle
Run Code Online (Sandbox Code Playgroud)

更新database.yml

#development:
#  adapter: sqlite3
#  database: db/development.sqlite3
#  pool: 5
#  timeout: 5000

development:
  adapter: postgresql
  encoding: unicode
  database: f3_development
  pool: 5
  username: f3
  password:

#test:
#  adapter: sqlite3
#  database: db/test.sqlite3
#  pool: 5
#  timeout: 5000

test:
  adapter: postgresql
  encoding: unicode
  database: f3_test
  pool: 5
  username: f3
  password:
Run Code Online (Sandbox Code Playgroud)

在sqlite数据库上启动点击服务器

$ taps server sqlite://db/development.sqlite3 user password
Run Code Online (Sandbox Code Playgroud)

迁移数据

$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000
Run Code Online (Sandbox Code Playgroud)

重新启动Rails Web服务器

$ rails s
Run Code Online (Sandbox Code Playgroud)

清理Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
Run Code Online (Sandbox Code Playgroud)

  • 我为什么要用水龙头? (3认同)

K A*_*RAM 11

现在使用单个命令变得容易

bin/rails db:system:change --to=postgresql
Run Code Online (Sandbox Code Playgroud)


Jes*_*ott 9

由于您要转移到heroku,您可以使用点按来执行此操作:

heroku db:push
Run Code Online (Sandbox Code Playgroud)

这将推动您的本地开发sqlite数据生产,heroku将自动转换为postgres为您.

这也应该可以将生产sqlite db推送到heroku,但它没有经过测试.

RAILS_ENV=production heroku db:push
Run Code Online (Sandbox Code Playgroud)


Gus*_*rtz 5

你还需要在你的gemfile中添加" gem'pg ' "行,'pg'是Rails的当前postgres gem.


jun*_*dre 5

只需更新config/database.yml文件:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: projectname_development

test:
  <<: *default
  database: projectname_test

production:
  <<: *default
  database: projectname_production
  username: 
  password: 
Run Code Online (Sandbox Code Playgroud)

以上是您运行时生成的内容:

$ rails new projectname --database=postgresql --skip-test-unit
Run Code Online (Sandbox Code Playgroud)

同时将其添加到您的Gemfile:

gem 'pg'
Run Code Online (Sandbox Code Playgroud)