Rails 5.2.3 / Heroku-为什么在开发模式下使用squlite3无法在生产模式下运行postgres?

时间:2019-05-31 17:26:18

标签: ruby-on-rails postgresql sqlite heroku

我正在使用Rails 5.2.3,尝试在Heroku管道上查看生产应用程序时出现应用程序错误,并且在以下情况下出现以下错误:

  • 我运行heroku logs,我得到:heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/"

  • 我运行heroku run rails console,我得到:Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? sqlite3 is not part of the bundle. Add it to your Gemfile. (LoadError)

  • 我运行heroku run rails db:migrate,我得到:LoadError: Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? sqlite3 is not part of the bundle. Add it to your Gemfile.

我要使用sqlite3进行开发,而要使用postgres进行生产,那么为什么需要使sqlite3 gemfile在生产模式下可用?

这是我的gemfile:

group :development do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end

这是我的数据库。yml:

default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

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

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

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

5 个答案:

答案 0 :(得分:2)

您的问题是这部分:

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

当前,您的产品仍在尝试使用sqlite,因为它会扩展为

production: 
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  database: db/production.sqlite3

显然db/production.sqlite3也建议使用sqlite数据库

改为将此部分更改为

production: 
  adapter: postgresql
  host: [your db host] 
  database: [your database] 
  username: [your username]
  password: [your password]
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

PostgreSQL所说的一切都是免费的,如果要部署到PostgreSQL,您真的不应该再次开发sqlite。

SQLite非常适合用于概念验证,因为它可以快速扩展且易于拆卸,并且没有实际的外部依赖关系,但是如果您要实际构建应用程序并将其部署到某个地方,则应该使用生产就绪型数据库

Heroku DB config

Heroku Getting started Rails 5

答案 1 :(得分:0)

您在production中的database.yml设置继承了development设置-您想将其更改为

production:
  adapter: postgresql
  url: <%= ENV['DATABASE_URL'] %>

如果您使用的是Heroku,则url: <%= ENV['DATABASE_URL'] %>适用。如果没有,则可以考虑凭证规范格式here

答案 2 :(得分:0)

像这样尝试 database.yml

default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

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

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

production:
  adapter: postgresql
  pool: 5
  timeout: 5000
  database: db/production.sqlite3

答案 3 :(得分:0)

我知道你写了

  

我想使用sqlite3进行开发,并使用postgres进行生产

我可以理解,因为我自己去过那里;感觉到postgres似乎是安装的一大步,并且“我只想要一些可以使用的小东西”。

也许您的原因有所不同,但是如果不是,安装postgres可以为您省去很多麻烦。 Postgres是免费的,默认安装设置可能会非常适合您。

除了为您节省适配器和gem不兼容的麻烦之外,有时您在可用的SQL命令(当您想做更高级的事情)以及什么东西具有高性能方面也有差异。

https://www.postgresql.org/download/

当开发和生产环境不同时,您将花费大量时间来修复不会增加所构建产品价值的事物。

答案 4 :(得分:0)

我通过将config / database.yml更改为:

来解决此问题。
server.ssl.key-store=/etc/environment/${SERVER_KEYSTORE}
server.ssl.key-store-password=/etc/environment/${SERVER_KEYSTORE_PASSWORD}

正在运行:public partial class MainForm : Form { public static string serverName; public static string database; public MainForm() { InitializeComponent(); } MySqlConnection connection = new MySqlConnection("server=" + serverName + "; Database=" + database + "; username=username; password=password"); public void btnTest_Click(object sender, EventArgs e) { serverName = txtServer.Text; database = txtDatabase.Text; try { connection.Open(); MessageBox.Show("Connected!"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } ,因为尚未为我的应用程序配置PostgreSQL。