在新的Rails项目中从SQLite更改为PostgreSQL
我有一个Rails应用程序,数据库在SQLite(开发和生产)。 由于我正在转向heroku,我想将我的数据库转换为PostgreSQL。
无论如何,我听说本地开发数据库不需要从SQLite中更改,所以我不需要改变,但是,我怎样才能把生产环境从SQLite转换到PostgreSQL呢?
有没有人曾经这样做,可以帮助?
PS我不确定这个过程是怎么调用的,但是我听说过从SQLite到PostgreSQL的数据库迁移,那么需要做什么?
你可以改变你的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
下面的步骤为我工作。 它使用由Heroku创build的水龙头gem,并在Ryan Bates的Railscast#342中提到。 有几个步骤,但工作完美(甚至date被正确迁移),它比我以前做的Oracle – > DB2或SQL Server – > Oracle迁移要容易得多。
请注意,SQLite没有用户名或密码,但水龙头gem需要的东西。 我只是使用文字“用户”和“密码”。
为新数据库创buildPostgres数据库用户
$ 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
编辑 – 更新下面的命令 – 使用此代替
$ createuser f3 -d -s
创build所需的数据库
$ createdb -Of3 -Eutf8 f3_development $ createdb -Of3 -Eutf8 f3_test
更新Gemfile
gem 'sqlite3' gem 'pg' gem 'taps' $ bundle
更新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:
在sqlite数据库上启动tap服务器
$ taps server sqlite://db/development.sqlite3 user password
迁移数据
$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000
重新启动Rails Web服务器
$ rails s
清理Gemfile
#gem 'sqlite3' gem 'pg' #gem 'taps' $ bundle
既然你正在转向heroku,你可以使用水龙头来做到这一点:
heroku db:push
这将推动你的本地发展的SQLite数据生产,并heroku将自动转换为您的postgres。
这也应该推动生产sqlite数据库到heroku,但它没有testing。
RAILS_ENV=production heroku db:push
您还需要将“gem'pg ' ”行添加到您的gem文件中,'pg'是当前Rails的postgres gem。
只需更新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:
以上是运行时生成的内容:
$ rails new projectname --database=postgresql --skip-test-unit
还要把这个添加到你的Gemfile中:
gem 'pg'
只需更新你datatbase.yml
development: &development adapter: postgresql database: Your_database_name username: user_name password: password host: localhost schema_search_path: public min_messages: warning test: <<: *development database: test_database_name production: <<: *development database: production_db_name
我们正在使用rails,基本的标准应该像DRY,Convention over Configuration等一样遵循。所以在上面的代码中我们不是一再重复相同的代码。
上面已经提到了我,但是我没有足够的声望来作为一个潜伏者来升级它。 希望能够引起Rails新手们更多的关注:
您还需要将“gem'pg'”行添加到您的gem文件中,'pg'是当前Rails的postgres gem。
^^^除了所选答案中描述的database.yml文件之外,这是一个关键部分,用于将Rails应用程序迁移到Postgres。
在gemfile中用gem pg
replacegem'sqlite3之后,当我推送到Heroku master时,我不断地收到sqlite3 error
,因为我忘记了提交更新的gemfile。 只要做到以下解决这个问题:
git add . git commit -m 'heroku push' heroku create git push heroku master
这是我有我的设置。 如果您只使用MRI而不使用Jruby,则可以跳过适配器设置中的逻辑。
defaults: &defaults adapter: <%= RUBY_ENGINE == 'ruby' ? 'postgresql' : 'jdbcpostgresql' %> encoding: unicode pool: 5 timeout: 5000 development: database: project_development <<: *defaults test: database: project_test <<: *defaults production: database: project_production <<: *defaults
你可以试试下面的代码: sqlite3 development.db .dump | psql dbname username
sqlite3 development.db .dump | psql dbname username
或尝试使用sqlitetopgscript: http ://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg
一个可能的解决scheme(不适用于heroku)是从以下使用yaml.db: