2017-06-27 2 views
0

J'ai un projet qui utilise actuellement des versions plus anciennes de l'environnement Ruby on Rails et utilise la base de données PostgreSQL. Les versions sont (oui, je sais ... ne riez pas, je dois soutenir cette ancienne version pour l'instant):rake db: schéma: vidage produit un schéma vide

ruby 1.8.7 
rails 2.3.11 
rake 10.5.0 
psql 9.5.7 

S'il importe, tout cela est installé sur un système Ubuntu 16.04. Tout fonctionnait sur un système plus ancien que j'avais, qui est finalement mort. J'ai donc mis en place rvm et ces versions de l'outil de développement sur la nouvelle machine et copiées sur la base de données.

Sur la nouvelle machine, tout semble fonctionner correctement excepté quelques tâches de base de données de rake que j'ai essayées. Si je lance, par exemple, rake db:schema:dump, je reçois pas de sortie d'erreur, et je reçois un fichier db/schema.rb avec le contenu suivant:

# This file is auto-generated from the current state of the database. Instead of editing this file, 
# please use the migrations feature of Active Record to incrementally modify your database, and 
# then regenerate this schema definition. 
# 
# Note that this schema.rb definition is the authoritative source for your database schema. If you need 
# to create the application database on another system, you should be using db:schema:load, not running 
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations 
# you'll amass, the slower it'll run and the greater likelihood for issues). 
# 
# It's strongly recommended to check this file into your version control system. 

ActiveRecord::Schema.define(:version => 0) do 

end 

J'ai essayé de courir rake db:structure:dump et eu une erreur:

/usr/lib/postgresql/9.5/bin/pg_dump: invalid option -- 'i' 
Try "pg_dump --help" for more information. 
rake aborted! 
Error dumping database 
/home/mark/.rvm/gems/[email protected]/gems/rails-2.3.11/lib/tasks/databases.rake:287 
/home/mark/.rvm/gems/[email protected]/bin/ruby_executable_hooks:15 
Tasks: TOP => db:structure:dump 
(See full trace by running task with --trace) 

Ma principale préoccupation est le manque de capacité à vider le schéma. Je ne comprends pas comment il fonctionne sans erreur, mais ne génère aucun schéma. Comme je l'ai mentionné au début, l'application fonctionne bien via script/server. J'ai également couru ActiveRecord::SchemaDumper.dump de la console avec exactement le même résultat (ce que je suppose devrait être attendu, puisque c'est ce que la tâche de rake fonctionne probablement). Mais à partir de la console, je peux examiner n'importe lequel des modèles et des données. Tout est là.

Vous ne savez pas pourquoi le fichier de schéma est vide? J'espère que quelqu'un a déjà vu ce phénomène. J'ai fait beaucoup de recherche de modes de défaillance de rake db:schema:dump et je n'ai pas trouvé ce symptôme particulier mentionné nulle part.

Répondre

1

Je l'ai fait un peu de creuser et a déterminé que la méthode tables du PostgresqlAdapter retournait une liste vide, même si elle avait une connexion valide à la base de données. La source de l'adaptateur est ici:

gems/activerecord-2.3.11/lib/active_record/connection_adapters/postgresql_adapter.rb 

La méthode ressemble à ceci:

# Returns the list of all tables in the schema search path or a specified schema. 
    def tables(name = nil) 
    schemas = schema_search_path.split(/,/).map { |p| quote(p) }.join(',') 
    query(<<-SQL, name).map { |row| row[0] } 
     SELECT tablename 
     FROM pg_tables 
     WHERE schemaname IN (#{schemas}) 
    SQL 
    end 

La chaîne retournée par schema_search_path ressemble, "\"$user\", public". Quand il est traité, le flan est réalisé précédent avec « public », de sorte que la requête est la vérification des schémas avec un nom de schéma qui est soit "\"$user\"" ou " public" il ne correspond pas au nom de "public" de schéma.

Je viens piraté le code un peu comme si, et maintenant mon rake db:schema:dump fonctionne très bien:

schemas = schema_search_path.split(/,/).map { |p| quote(p.strip) }.join(',') 

Je soupçonne qu'il ya une meilleure façon de vraiment résoudre le problème, mais cela fonctionne de manière fiable pour moi. Pour ne pas mentionner à ce stade, la version que j'utilise est si vieille peut-être que personne ne s'en soucie. J'ai regardé les implémentations ultérieures de tables et elles sont un peu différentes.

-1

Je pense que postgresql 9.5 cause le problème. Veuillez rétrograder le postgresql.

Ce comportement est déjà rapporté dans des rails page GitHub : Ref

J'espère que cela vous aidera.

Vive

+0

Cela peut expliquer l'option invalide 'i', mais je ne suis pas sûr qu'il explique le schéma vide, qui est le plus gros problème. J'ai un ami qui travaille avec moi sur le même projet et il gère Postgresql 9.1.20. – lurker