Einen einzelnen Tisch zu Heroku schieben - Ruby-on-Rails, Datenbank, Heroku, Deployment

Ich bin mir der bewusst heroku pg:push Befehl, der eine ganze Datenbank an Heroku weiterleitet.

Jetzt, wo ich mein Produkt starte, möchte ich nur eine bestimmte Tabelle hochschieben können, die lokal erfasste Informationen enthält, ohne vorhandene Tabellen (wie Benutzer) zu überschreiben.

Gibt es einen Befehl, der es mir ermöglicht, bestimmte Tabellen nur an heroku zu senden?

Antworten:

10 für die Antwort № 1

Mein Vorschlag ist, PostgreSQL Dump / Restore-Funktionen direkt mit der pg_dump und psql Befehle.

Mit pg_dump Sie können eine bestimmte Tabelle aus Ihrer lokalen Datenbank ausgeben

$ pg_dump --data-only --table=products sourcedb > products.sql

Dann greifen Sie die Heroku PostgreSQL-Verbindungszeichenfolge aus den Konfigurationen

$ heroku config | grep HEROKU_POSTGRESQL

# example
# postgres://user3123:[email protected]:6212/db982398

und Wiederherstellen der Tabelle in der entfernten Datenbank unter Verwendung der von Heroku abgerufenen Informationen.

$ psql -h ec2-117-21-174-214.compute-1.amazonaws.com -p 6212 -U user3123 db982398 < products.sql

Sie müssen das anpassen -p, -h und -U Parameter sowie der Datenbankname. Das Passwort wird von angezeigt psql.

Sie können auch die pg_restore einen Dump zu filtern und die Tabelle wiederherzustellen, aber ich persönlich bevorzuge psql.

Beachten Sie, dass Heroku die Verwendung von PostgreSQL-Tools in verschiedenen Dokumentationen empfiehlt, z Importieren und Exportieren für große Daten oder immer dann, wenn die bereitgestellten CLI-Befehle bestimmte Fälle wie den in dieser Frage nicht abdecken.


0 für die Antwort № 2

Ich habe ein Skript geschrieben, das DB url aus heroku extrahiert. Dann werden einzelne Tabellen aus der Produktion ausgegeben und auf development / localhost wiederhergestellt. Führen Sie es so:

rake production_to_development:run["users;news;third_table",my-sushi-app]

Code:

namespace :production_to_development do
task :run, [:tables, :app] => [:environment] do |t, args|
tables = args["tables"].split(";")
database_url = nil
Bundler.with_clean_env { database_url = `heroku config:get DATABASE_URL --app=#{args["app"]}` }

require "addressable/uri"
uri = Addressable::URI.parse(database_url)
remote_database = uri.path[1,uri.path.length-2] # there is n at the end of the path!

tables.each do |table|
backup_file = "tmp/#{table}.backup"
#bin_dir = "/Applications/Postgres.app/Contents/Versions/latest/bin"
bin_dir = ""

dump_command = "PGPASSWORD=#{uri.password} #{bin_dir}/pg_dump --file "#{backup_file}" --host "#{uri.host}" --port "#{uri.port}" --username "#{uri.user}" --no-password --verbose --format=c --blobs --table "public.#{table}" "#{remote_database}""
`#{dump_command}`
`psql -U "root" -d my_table -c "drop table if exists #{table}"`
`pg_restore -d my_table --no-owner  #{backup_file}`
end

end
end

-1 für die Antwort № 3

Wenn ich richtig verstehe, brauchen Sie nur eine einzigeDatenbanktabelle mit den lokal erstellten Daten, die Sie an Ihre Rails-Produktionsanwendung gesendet haben. Vielleicht ist dies ein vereinfachender Ansatz, aber Sie könnten eine Migration für Ihre Tabelle erstellen und dann mit verwenden db/seeds.rb.

Nachdem Sie die Datei samen.rb ausgefüllt und Ihren Repo nach heroku verschoben haben:

heroku run rake db:migrate
heroku run rake db:seed

Wenn Ihre lokale Tabelle eine Menge Daten enthält und Sie Rails 4 verwenden, sollten Sie den Seed-Dump-Gem überprüfen: https://github.com/roblak/seed_dump. Dadurch werden Ihre vorhandenen Datenbankdaten übernommen und dem Seed-Format zugeordnet.


Verwandte Fragen
Speisekarte