Cambie de SQLite a PostgreSQL en un nuevo proyecto Rails

125

Tengo una aplicación de rieles cuyas bases de datos están en SQLite (El desarrollador y la producción). Como me estoy mudando a heroku, quiero convertir mi base de datos a PostgreSQL.

De todos modos, escuché que no es necesario cambiar la base de datos local de desarrollo de SQLite, así que no necesito cambiar eso, sin embargo, ¿cómo hago para cambiar el entorno de producción de SQLite a PostgreSQL?

¿Alguien ha hecho esto antes y puede ayudar?

PD No estoy seguro de cómo se llama exactamente este proceso, pero escuché sobre la migración de la base de datos de SQLite a PostgreSQL, ¿es eso lo que hay que hacer?

Vasseurth
fuente
2
¿Tiene datos de producción en vivo que deben ir con ellos, o es una aplicación nueva / nueva?
Dylan Markow
19
Recomiendo que cambie su entorno de desarrollo a PostgreSQL también. SQLite y PostgreSQL (y cualquier otra base de datos) tienen ideas diferentes sobre lo que significa "SQL válido" y ningún ORM puede aislarlo de todas las idiosincrasias de la base de datos.
mu es demasiado corto el

Respuestas:

101

Puede cambiar su database.yml a esto en lugar de usar el sqlite de fábrica:

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
fuente
1
¿Debo poner project_test o el nombre de mi base de datos?
Vasseurth
55
Puedes nombrarlo como quieras. Si el nombre de su proyecto es 'calculadora', los llamaría calculator_production, calculator_test, calculator_development
Chris Barretto
2
@mmichael realmente depende de cómo tengas configurados tus postgres. El uso de postgres.app, brew o native si está en MacOS X Lion + tiene diferentes restricciones en su configuración predeterminada. Por lo tanto, si el nombre de usuario y la contraseña no se aplican, puede omitirlos o dejarlos sin valores. Esto era simplemente más de un tipo de configuración 'catch all'.
Chris Barretto
2
¿Qué está haciendo '& TEST' allí (línea 9)?
David Rhoden
2
"& TEST" está configurando TEST como el conjunto predeterminado de opciones. Luego se pueden anular o simplemente dejar de lado. "<<: * TEST" es la forma de acceder al @DavidRhoden predeterminado
Chris Barretto
44

Los siguientes pasos funcionaron para mí. Utiliza la gema de grifos , creada por Heroku y mencionada en Railscast # 342 de Ryan Bates. Hay algunos pasos, pero funcionó perfectamente (incluso las fechas se migraron correctamente), y fue mucho más fácil que las migraciones de Oracle -> DB2 o SQL Server -> Oracle que he hecho en el pasado.

Tenga en cuenta que SQLite no tiene una identificación de usuario o contraseña, pero la gema de grifos requiere algo. Acabo de usar los literales "usuario" y "contraseña".

Cree el usuario de la base de datos Postgres para las nuevas bases de datos.

$ 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

EDITAR - Comando actualizado a continuación - use esto en su lugar

$ createuser f3 -d -s

Crea las bases de datos requeridas

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

Actualiza el Gemfile

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

Actualizar 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 el servidor de grifos en la base de datos sqlite

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

Migrar los datos.

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

Reinicie el servidor web Rails

$ rails s

Limpiar el Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
Ardochhigh
fuente
10

Como te estás mudando a heroku, puedes usar toques para hacer esto:

heroku db:push

Esto empujará sus datos de sqlite de desarrollo local a producción, y heroku se convertirá automáticamente en postgres para usted.

Esto también debería funcionar para impulsar una producción sqlite db a heroku, pero no se ha probado.

RAILS_ENV=production heroku db:push
Jesse Wolgamott
fuente
1
La gema de grifos no parece funcionar bien con 1.9.3, es posible que deba instalar 1.9.2 localmente para que se ejecute, una vez que lo hice, fue increíblemente
sbeam
Esto ya no es posible. Consulte esta pregunta para obtener más información: stackoverflow.com/questions/19817851/…
sykaeh
5

también necesitará agregar la línea " gema 'pg' " a su archivo de gemas, siendo 'pg' la gema actual de postgres para Rails.

Gus Shortz
fuente
5

Simplemente actualice el archivo 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: 

Lo anterior es lo que se genera cuando ejecuta:

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

También agregue esto a su Gemfile:

gem 'pg'
jungledre
fuente
5

Ahora se vuelve fácil con el comando único

bin/rails db:system:change --to=postgresql
K ABHIRAM
fuente
1
Esta es una gran respuesta, cambia el archivo database.yml con los valores necesarios. Todavía puede entrar allí y cambiar el nombre de la base de datos de acuerdo con su proyecto.
csalmeida
3

Después de reemplazar gema 'sqlite3con gema pgen el archivo de gemas, seguí obteniendo el sqlite3 errorempuje al maestro Heroku porque olvidé comprometer el archivo de gemas actualizado. Simplemente haciendo lo siguiente resolvió esto:

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

Simplemente actualice su 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 utilizando rieles y los estándares básicos deben seguirse como DRY, Convención sobre configuración, etc., por lo que en el código anterior no repetimos el mismo código una y otra vez.

sunil
fuente
2

Se ha mencionado anteriormente, pero no tengo suficiente reputación como merodeador para poder votarlo. Con la esperanza de llamar un poco más la atención de los novatos de Rails que leen esta respuesta:

también necesitará agregar la línea "gema 'pg'" a su archivo de gemas, siendo 'pg' la gema actual de postgres para Rails.

^^^ Esta es una pieza clave además del archivo database.yml descrito en la respuesta seleccionada para migrar su aplicación Rails a Postgres.

Justin Houk
fuente
1

Así es como tengo la configuración mía. Si solo usa MRI y no Jruby, puede omitir la lógica en la configuración del 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
fuente
0

Hoy tuve el mismo problema. Estoy trabajando en Rails 4.2.8. La solución fue especificar la versión de gema pg, en mi caso 0.18.4,.

Benjamin Peña Olvera
fuente