如何将我现有的Rails应用程序迁移到Heroku?(从SQLite到PostgreSQL)

3

我有一个已经存在数据的Ruby on Rails应用程序。

我使用默认的SQLite数据库设置,因此我的所有数据都在那里,但是我需要把所有数据放入我的heroku上的Postgres数据库中。

我该怎么做?

2个回答

6

从本地SQLite迁移到Heroku Postgres的10分钟

-- 在此过程中将您的本地开发环境更新为Postgres --

假设您有一个使用SQLite作为开发数据库,并且希望将结构和数据移动到Heroku。您将首先更改本地环境为Postgres,然后全部移到Heroku。

为什么要更改?您应该始终使开发环境与生产环境相同。在Heroku上,默认情况下使用Postgres。

您需要首先安装并配置本地Postgres,其中包含具有您用户名的用户


所需软件:postgresql、pgloader、heroku-cli


步骤

从SQLite迁移到Postgres

  1. 安装heroku/pgloader/postgres,并确保PostgreSQL正在运行
  2. 备份SQLite-将development.sql复制到development_old.sql
  3. 在Gemfile的主要部分中添加gem 'pg'
  4. 运行bundle install
  5. 更新config/database.yml(请参见下面的示例)
  6. 运行rake db:setup
  7. 进入[应用程序根目录]
  8. 使用数据加载Postgres数据库- pgloader ./db/development.sqlite3 postgresql:///[Postgres开发数据库名称]
  9. 删除gem 'sqlite3'
  10. 运行bundle install
  11. 启动服务器- rails server
  12. 访问localhost:3000测试应用程序

在Heroku上设置新应用程序

按照Heroku的说明操作

将数据移动到Heroku

  1. 查找Heroku数据库信息- heroku pg:info
  2. 擦除并重置远程数据库- heroku pg:reset DATABASE_URL --app [应用程序名称]
  3. 将本地数据推送到Heroku- heroku pg:push [Postgres开发数据库名称] DATABASE_URL --app [应用程序名称]

注意:如果该数据库包含大于10k行,则还需要升级为Heroku的Hobby Basic级别

将Heroku升级为Hobby Basic级别

  1. 创建新层 - `heroku addons:create heroku-postgresql:hobby-basic --app [应用名称]
  2. 获取新数据库URL - heroku pg:info
  3. 打开维护模式 - heroku maintenance:on --app [应用名称]
  4. 复制数据 - heroku pg:copy DATABASE_URL [HEROKU_POSTGRESQL_COLOR_URL] --app [应用名称]
  5. 提升新数据库 - heroku pg:promote [HEROKU_POSTGRESQL_COLOR_URL] --app [应用名称]
  6. 关闭维护模式
  7. 通过访问Heroku应用程序进行测试

如果遇到问题或边缘情况,请使用以下资源进行帮助。

资源:

database_sample.yml

default: &default
  adapter: postgresql
  encoding: unicode
  host: localhost
  port: 5432
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: [name of app]_dev

test:
  <<: *default
  database: [name of app]_test

staging:
  <<: *default
  database: [name of app]

production:
  <<: *default
  database: [name of app]

1
我无法表达对这个答案的喜爱 - 真是太棒了。 - RTIndy
你如何进行身份验证?rake db:setup 给我返回了 Couldn't create '..._dev' database. Please check your configuration. rake aborted! 的错误信息。 - gordie
我通过以下步骤成功实现了这个目标:首先创建一个用户,在我的database.yml文件中定义用户名和密码,然后使用以下命令替代你的命令:pgloader ./db/development.sqlite3 postgresql:///[username]:[password]@[name of postgres dev db] - gordie

1

有两个问题。首先,很抱歉,由于宝石冲突,我无法安装taps。该项目已经8年了,不再被heroku推荐使用。其次,即使我让它工作了,这篇文章仍然没有解释如何将数据从本地传输到heroku。那就是我开始的地方,也是我决定添加上述步骤的原因。 - Dan Williams
明白了,亲爱的朋友。如果Heroku不再推荐这样做,那么这样做的目的是什么? - Nicollas
1
现在他们建议让您的开发环境模仿生产环境,然后使用Heroku的pg:push和pg:pull来移动数据(如果您正在使用Postgres)。我找到的关于Heroku上Taps的最后一篇文章是2009年的。我必须说,Taps可能完全适合您,如果是这样,您提到的文章应该很好用。但我无法让它正常工作,所以我看看现在的技术是什么。干杯! - Dan Williams
非常好,亲爱的朋友 - Nicollas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接