J'ai dû migrer d'une application Ruby sur Ruby basée sur MySQL pour utiliser PostgreSQL. Pas de problèmes mais un à ce jour, et je ne sais pas comment résoudre.
La migration des données a apporté des identifiants avec elle et PostgreSQL a maintenant des problèmes avec les identifiants existants: ce n'est pas clair pour moi où il reçoit la valeur qu'il utilise pour déterminer la base pour NextVal: ce n'est certainement pas le plus élevé Valeur dans la colonne, bien que vous puissiez penser que ce serait une bonne idée. En tout cas, il collectionne maintenant avec les valeurs d'identification existantes. Colonne ID, créée à partir d'une migration standard ROR est définie comme P>
'select max(id) from <table_name>'
5 Réponses :
PG utilise des séquences:
Faites sa valeur actuelle 1 supérieure à la valeur la plus élevée de votre table comme celle-ci. p> voir aussi ces p> http://www.postgresql.org/docs/8.4/interactive/dataType-numeric.html#daTaType-Serial p> < Un href = "http://www.postgresql.org/docs/8.4/interactive/fonctions-Equence.html" rel = "nOfollow noreferrer"> http://www.postgresql.org/docs/8.4/interactive/functions -Sucidence.html p> p>
Avec cette définition, la colonne obtiendra la valeur suivante de la séquence Geopoints_id_seq. Cette séquence n'est pas directement attachée à la table. Si vous migrez des données, vous devez créer ou mettre à jour cette séquence afin que son point de départ soit supérieur à l'ID max actuel de votre table.
Vous devriez pouvoir définir sa nouvelle valeur avec par exemple P>
ALTER SEQUENCE geopoints_id_seq RESTART with 1692;
Il y a un Dans certains projets, je reçois des données etl'ed assez souvent pour justifier une tâche de râteau pour le faire pour tous les modèles , ou pour un modèle spécifié. Voici la tâche - incluez-la dans certains microsphiles ou de ses propres tâches: p> Vous pouvez exécuter cela soit pour tous les modèles (définis sous Rais_root / app / modèles ) Utilisation de réinitialiser_pk_réquences! code> méthode sur le Adaptateur Postgres . Vous pouvez l'appeler et cela le mettra à max (ID) + 1, ce qui est probablement ce que vous voulez.
RAQUER RESET_EFENCIENCESSES CODE> ou pour un modèle spécifique en passant dans un nom de classe. p> p>
WOW, merci pour les réponses rapides et utiles. Je vais faire une course à la solution @Hgimenez, car je suis dans un environnement de rails, mais je présume que le message est que je peux le faire via une ligne de commande à Postgres. En suivant: Je vais essayer cela, mais puis-je mettre une telle déclaration dans une migration?
Certainement, vous pouvez avoir une migration qui va: ActiveRecord :: base.connection.reeset_pk_srequence! ('Nom de table »), mais cela peut certainement être effectué à partir de PSQL.
Joli. Merci de votre aide.
La version Rails 3 ressemble à ceci:
Je pense que rails_root code> doit être
rails.root.to_s code> à la place. De plus, la syntaxe code> Task code> est obsolète. Je pense que cela devrait être
tâche: réinissification, [: model_class] => [: environnement] code>