针对现有应用将Sqlite3切换到PostgreSQL

Sas*_*sha 2 sqlite postgresql ruby-on-rails heroku

我正在尝试将开发(和测试/生产)数据库切换到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
Run Code Online (Sandbox Code Playgroud)

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

根据Railscast的建议,我自行安装了PostgreSQL,然后初始化了db,然后执行了这一行.

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
Run Code Online (Sandbox Code Playgroud)

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

export PATH="/Applications/Postgres.app/Contents/MacOS/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

另外在Railscast的建议中,我安装了tap专业版,并执行了以下几行:

taps server sqlite://db.development.sqlite3 <username> <password>
Run Code Online (Sandbox Code Playgroud)

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

taps pull postgresql://<username>@localhost/<appname>_development http://localhost//5000
Run Code Online (Sandbox Code Playgroud)

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

Failed to connect to database:
  Sequel::AdapterNotFound -> LoadError: cannot load such file -- sequel/adapters/postgresql
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

jef*_*unt 8

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

Heroku将忽略您的database.yml文件所说的任何生产.Heroku将production自动为Bamboo和Cedar堆栈注入自己的配置.换句话说 - production留空 - 在部署到Bamboo或Cedar堆栈时不需要它.

另一方面,如果您正在部署到Amazon Web Services,但是使用Heroku的托管Postgres解决方案作为您的后端数据库(它本身在AWS上运行),您可以在其中指定一个production部分database.yml.

"水龙头"的宝石

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

话虽这么说,如果您的本地数据库只是开发数据,并假设它可以重新创建(它应该是 - 它只是开发数据),那么您可能taps完全放弃使用.只是不要将您的开发数据从SQLite迁移到Postgres - 只需停止使用SQLite并开始使用Postgres,其中包含已运行所有迁移的空数据库,或者在其上运行db:schema:load.

通过Populator可以创建易于重新创建的优秀开发数据(为了您的未来需求 - 我现在不用太担心).

"无法连接到数据库:"错误

你安装pg宝石吗?这是Rails与PostgreSQL服务器通信所需的宝石.我对这个错误的解释表明你只是错过了pg宝石,因此,"Sequel :: AdapterNotFound"

游泳池

池是您希望从应用程序向数据库提供的并发连接数.使用SQLite,您可以指定此项以允许一定数量的并发读取.SQLite (与其文档隐含的内容相反)不支持并发写入.

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

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

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

有关于连接池的详细信息在这里.