【问题标题】:Switching Sqlite3 to PostgreSQL for existing app为现有应用程序将 Sqlite3 切换到 PostgreSQL
【发布时间】:2012-09-10 01:21:15
【问题描述】:

我正在尝试将开发(和测试/生产)数据库切换到 PostgreSQL,以便我可以将我的 rails 应用程序部署到 Heroku。

按照他们的指示和 railscast 并查看 StackOverflow 和 Google 寻找重写我的 database.yml 文件并执行其他所有操作的正确方法,但我遇到了很多问题,所以我希望有人能提供帮助我弄清楚我还需要做什么。我将在下面解释我的尝试。

一个主要问题是如何处理我的 database.yml 文件。许多站点不同意,或者根本没有任何池或用户名或编码条目(或者,就此而言,整个生产环境)。这是我环顾四周并结合后得到的结果。这应该工作吗?:

development:
  adapter: postgresql
  encoding: unicode
  database: <appname>_development
  pool: 5
  username: <username>
  password: <password>

test:
  adapter: postgresql
  database: <appname>_test
  username: <username>
  password: <password>
  host: localhost

什么是池?我需要编码吗?为什么这么多的例子在 yml 文件中没有生产部分?

根据 Railscast 的建议,我自制安装了 PostgreSQL,然后初始化了数据库,然后执行了这一行。

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

在另一个 StackOverflow 回答之后,我确保我的 Postgres 位于 /usr/local/bin/postgres 目录中,并将这一行添加到我的 .bash_profile 文件中。

export PATH="/Applications/Postgres.app/Contents/MacOS/bin:$PATH"

同样根据 Railscast 的建议,我安装了 taps gem,并执行了以下几行:

taps server sqlite://db.development.sqlite3 <username> <password>

然后打开一个新标签并执行:

taps pull postgresql://<username>@localhost/<appname>_development http://localhost//5000

但是当我输入时,我收到以下错误:

Failed to connect to database:
  Sequel::AdapterNotFound -> LoadError: cannot load such file -- sequel/adapters/postgresql

当然我做错了。 (例如,我应该从 sqlite3 数据库中提取吗?我怎么知道它的 url?)。但我不知道如何开始故障排除,所以我想我会寻求帮助。

谢谢!

【问题讨论】:

  • 仅供参考,虽然最佳做法是切换以使您的环境匹配,但您不必切换到部署到 heroku。您可以使用组有条件地在 gemfile 中加载内容。
  • 您是否安装了“pg”gem?
  • 是的。我做到了。不过,我想我可能用错了水龙头。文档建议使用这样的拉线,我不知道 httpuser 和 httppassword 是什么意思: taps pull postgres://dbuser:dbpassword@localhost/dbname httpuser:httppassword@example.com:5000

标签: ruby-on-rails postgresql heroku sqlite


【解决方案1】:

Heroku,以及“database.yml”文件的“生产”部分

Heroku 将忽略您的 database.yml 文件对生产的任何内容。 Heroku 将自动为 Bamboo 和 Cedar 堆栈注入自己的 production 配置。换一种说法 - 将 production 留空 - 部署到 Bamboo 或 Cedar 堆栈时不需要它。

另一方面,如果您要部署到 Amazon Web Services,但使用 Heroku's hosted Postgres solution 作为后端数据库(它本身运行在 AWS 之上),您database.yml 中指定一个production 部分。

“水龙头”宝石

这似乎是一个 gem,它允许您将数据从现有数据库(SQLite,适合您)迁移到新数据库(PostgreSQL,我希望您从现在开始将其用于本地开发)。我没有读太多,但我猜taps 使用 ActiveRecord(或其他 ORM 解决方案)从它支持的任何数据库中读取记录,然后使用 ActiveRecord 将数据写回目标数据库.通过使用 ActiveRecord 作为一种数据库间翻译器,您无需编写特定于数据库的查询来移动数据。

话虽如此,如果您的本地数据库只是开发数据,并假设它可以重新创建(应该是 - 它只是开发数据),那么您可以放弃使用 @987654332 @完全。只需不要将您的开发数据从 SQLite 迁移到 Postgres - 只需停止使用 SQLite 并开始使用 Postgres 和一个空数据库,您的所有迁移都已运行,或者上面有 db:schema:load

可以通过Populator 创建易于随心所欲地重新创建的出色开发数据(以满足您未来的需求 - 我现在不会太担心)。

“连接数据库失败:”错误

你安装the pg gem了吗?那是您在 Rails 中与 PostgreSQL 服务器通信所需的宝石。我对该错误的解释表明您只是缺少pg gem,因此,“Sequel::AdapterNotFound”

游泳池

池是您希望从您的应用程序中为数据库提供的并发连接数。使用 SQLite,您可以指定它以允许一定数量的并发读取。 SQLite(contrary to what is implied by its documentation) does not support concurrent writes.

当您的应用由多个 Web 实例提供服务时,该池在生产环境中非常有用。池指定与数据库的最大并发连接数,通常您的 Web 服务器将使用一个连接,每个活动请求,每个线程,或大约。我在这里捏造技术细节,但重点是您需要支持的并发性(并发请求越多)越多,您可能需要的可用连接就越多。

如前所述,无论如何,这在 Heroku 上都会被忽略,因此指定它是没有意义的,在本地开发中,您可能一次只会发出一个请求,因此将其设置为 1 可能看起来与将其设置为5

那么,当池中的所有连接当前都在使用时会发生什么?任何后续请求都会排队,直到连接可用或连接超时,以先到者为准。

关于连接池here的更多信息。

【讨论】:

  • 是的。我已经安装了 pg gem。另外,我是 Rails 的新手,不知道你抛弃 SQLite 并重新开始是什么意思。我怎么做?回滚模型然后再次生成它们?
  • 我的意思是,停止使用 SQLite 并开始使用 Postgres。抱歉——“转储”也是一个数据库术语,本质上是将数据库的内容导出到文件中,但这不是我的意思。我的意思是“转储”它,就像停止使用它一样。
  • 如果您可以避免将开发数据从 SQLite 移动到 Postgres(重新开始 - 从长远来看可能会节省您的时间),那么您根本不需要 taps gem .
  • 抱歉第二个愚蠢的问题。一个人如何“停止”使用一个数据库并开始使用另一个数据库?只需更改 database.yml 文件?那是否应该摆脱我的旧数据但又是无缝的?很抱歉我这么一无所知——几周前才进入 Rails(/code) 世界,其中大部分内容对我来说都是希腊语。
  • 顺便说一句,非常感谢您的详细回答。真的很感激。
【解决方案2】:

Taps 使用 Sequel,Sequel 使用 postgres://... 而不是 postgresql://... 连接字符串。试试看:taps pull postgres://&lt;username&gt;@localhost/&lt;appname&gt;_development http://localhost//5000

【讨论】:

  • 这是正确的答案,即使那里有很长的答案,但这是正确的
【解决方案3】:

我最近这样做了,我的 database.yml 只使用:

development:
  adapter: postgresql
  username: my_user
  database: my_project_development

如果您在 Heroku 上的 Postgres 数据库中有数据,您可以使用heroku db:pull 来填充您的 Postgres 开发数据库。否则,您可以可能 db:push 您的 Sqlite 数据(从您的机器,使用旧的 database.yml 配置)到 Heroku,更新您的 database.yml,然后执行 db:pull

【讨论】:

  • 所以你的意思是使用 sqlite3 dev 和 postgresql 生产推送到 heroku,然后使用水龙头从该数据库中提取(一旦它工作)?
【解决方案4】:

这通常是我用于 postgres 的:

production:
  adapter: postgresql
  encoding: utf8
  database: app_name
  pool: 5
  host: localhost
  username: username
  password: password

此外,请记住 yaml 可能会很糟糕,因此请务必避免使用制表符并在格式中仅使用空格。

【讨论】:

    【解决方案5】:

    为您的 RoR 应用程序从 SQLite 迁移到 Postgres 需要 10 分钟

    这是假设您在 sqlite 中有一个开发数据库,​​并且您希望将结构和数据移动到 postgres。

    您需要先在本地安装和配置 Postgres,使用您的用户名here are the postgres install docs


    需要的软件:postgresql、pgloader


    步骤

    1. 安装 pgloader / postgres,并确保 postgresql 在您的系统上运行
    2. 备份 sqlite - 将 development.sql 复制到 development_old.sql
    3. gem 'pg' 添加到 Gemfile 的主要部分
    4. 捆绑安装
    5. 更新 config/database.yml(参见下面的示例)
    6. rake db:setup
    7. cd [应用程序根目录]
    8. 使用来自 sqlite 的数据加载 postgres db

    pgloader ./db/development.sqlite3 postgresql:///[name of postgres dev db]

    1. 从您的 gemfile 中删除 gem 'sqlite3'
    2. 捆绑安装
    3. 启动服务器 - rails server
    4. test by visiting app at localhost:3000

    如果您遇到问题或边缘情况,这里有一些资源可以提供帮助。

    资源:

    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]
    

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      相关资源
      最近更新 更多