Mude do SQLite para o PostgreSQL em um novo projeto Rails

125

Eu tenho um aplicativo de trilhos que os bancos de dados estão no SQLite (o desenvolvedor e a produção). Como estou migrando para o heroku, quero converter meu banco de dados em PostgreSQL.

De qualquer forma, ouvi dizer que o banco de dados local de desenvolvimento não precisa ser alterado do SQLite; portanto, não preciso alterar isso; no entanto, como faço para alterar o ambiente de produção do SQLite para o PostgreSQL?

Alguém já fez isso antes e pode ajudar?

PS Não sei ao certo como exatamente esse processo é chamado, mas ouvi falar sobre a migração do banco de dados do SQLite para o PostgreSQL. É isso que precisa ser feito?

Vasseurth
fonte
2
Você tem dados de produção ao vivo que precisam acompanhá-los ou é um aplicativo novo / novo?
Dylan Markow
19
Eu recomendo que você mude seu ambiente de desenvolvimento para PostgreSQL também. O SQLite e o PostgreSQL (e todos os outros bancos de dados) têm idéias diferentes sobre o que significa "SQL válido" e nenhum ORM pode isolá-lo de todas as idiossincrasias do banco de dados.
mu é muito curto

Respostas:

101

Você pode alterar seu database.yml para isso em vez de usar o sqlite pronto para uso:

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
Chris Barretto
fonte
1
Devo colocar project_test ou o nome do meu banco de dados?
Vasseurth
5
Você pode nomear o que quiser. Se o nome do projeto é 'calculadora' eu nomeá-los calculator_production, calculator_test, calculator_development
Chris Barretto
2
@ Michael, depende realmente de como você configurou o seu postgres. O uso do postgres.app, brew ou native, se você estiver no MacOS X Lion +, tem restrições diferentes na configuração padrão. Portanto, se o nome de usuário e a senha não se aplicarem, você poderá excluí-los ou entrar sem valores. Este foi apenas mais um tipo de configuração "pegar tudo".
31513 Chris Barretto
2
O que o '& TEST' está fazendo lá (linha 9)?
David Rhoden
2
"& TEST" está configurando TEST como o conjunto de opções padrão. Mais tarde, eles podem ser substituídos ou deixados de fora. "<<: * TEST" é a maneira de acessar o padrão @DavidRhoden
Chris Barretto
44

Os passos abaixo funcionaram para mim. Ele usa a gema torneiras , criada por Heroku e mencionada no Railscast # 342 de Ryan Bates. Existem algumas etapas, mas funcionou perfeitamente (até as datas foram migradas corretamente) e foi muito mais fácil do que as migrações Oracle -> DB2 ou SQL Server -> Oracle que fiz no passado.

Observe que o SQLite não possui um ID de usuário ou senha, mas a gema torneiras exige algo. Eu apenas usei os literais "usuário" e "senha".

Crie o usuário do banco de dados Postgres para os novos bancos de dados

$ 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

EDIT - comando atualizado abaixo - use isso em vez

$ createuser f3 -d -s

Crie os bancos de dados necessários

$ createdb -Of3 -Eutf8 f3_development
$ createdb -Of3 -Eutf8 f3_test

Atualize o Gemfile

gem 'sqlite3'
gem 'pg'
gem 'taps'
$ bundle

Atualizar 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:

Inicie o servidor taps no banco de dados sqlite

$ taps server sqlite://db/development.sqlite3 user password

Migrar os dados

$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000

Reinicie o servidor da web Rails

$ rails s

Limpeza do Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
ardochhigh
fonte
10

Como você está migrando para o heroku, pode usar toques para fazer isso:

heroku db:push

Isso enviará os dados sqlite de desenvolvimento local para produção, e o heroku converterá automaticamente para postgres para você.

Isso também deve funcionar para enviar um db sqlite de produção para o heroku, mas não foi testado.

RAILS_ENV=production heroku db:push
Jesse Wolgamott
fonte
1
o gem do taps não parece funcionar bem com o 1.9.3, talvez seja necessário instalar o 1.9.2 localmente para que ele funcione - uma vez que fiz isso, foi incrivelmente
sbeam 23/08
Isto não é mais possível. Veja esta pergunta para obter mais informações: stackoverflow.com/questions/19817851/…
sykaeh
5

você também precisará adicionar a linha " gem 'pg' " ao seu arquivo de gem, 'pg' sendo a gem atual do postgres para o Rails.

Gus Shortz
fonte
5

Simplesmente atualize o arquivo 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: 

O acima é o que é gerado quando você executa:

$ rails new projectname --database=postgresql --skip-test-unit

Adicione isso também ao seu Gemfile:

gem 'pg'
jungledre
fonte
5

Agora ficou fácil com o único comando

bin/rails db:system:change --to=postgresql
K ABHIRAM
fonte
1
Esta é uma ótima resposta, pois altera o database.yml com os valores necessários. Você ainda pode entrar lá e alterar o nome do banco de dados de acordo com o seu projeto.
csalmeida
3

Depois de substituir gema 'sqlite3por gema pgno arquivo de gemas, eu continuei recebendo o sqlite3 errorpush ao mestre Heroku porque esqueci de confirmar o arquivo de gemas atualizado. Basta fazer o seguinte:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master
Zorak
fonte
3

Basta atualizar seu 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

Estamos usando trilhos e os padrões básicos devem ser seguidos como DRY, Convenção sobre Configuração, etc. Assim, no código acima, não repetimos o mesmo código repetidamente.

tomar sol
fonte
2

Isso foi mencionado acima de mim, mas não tenho reputação suficiente como espreitador para poder votá-lo. Na esperança de chamar um pouco mais de atenção para os novatos do Rails, leia esta resposta:

você também precisará adicionar a linha "gem 'pg'" ao seu arquivo de gem, 'pg' sendo a gem atual do postgres para o Rails.

^^^ Essa é uma peça fundamental, além do arquivo database.yml descrito na resposta selecionada para migrar seu aplicativo Rails para o Postgres.

Justin Houk
fonte
1

É assim que eu tenho a minha configuração. Se você estiver usando apenas ressonância magnética e não Jruby, poderá pular a lógica nas configurações do adaptador.

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
ianks
fonte
0

Hoje eu tive o mesmo problema. Estou trabalhando no Rails 4.2.8. A solução foi especificar a versão pg gem, no meu caso 0.18.4,.

Benjamin Peña Olvera
fonte