Les Rails De La Migration De Créer La Table De Clé Primaire
Je suis en train d'écrire un script de migration pour créer une table avec une colonne de clé primaire qui est nommé guid
et est un VARCHAR(25)
. Le problème c'est que je sens que je vais avoir à le double de mon effort pour réaliser ce que devrait être possible en une seule étape.
Si je lance:
create_table(:global_feeds, :primary_key => 'guid') do |t|
t.string :guid, :limit => 25
t.text :title
t.text :subtitle
...
t.timestamps
end
- Je obtenir une table avec une clé primaire appelé guid
pas de colonne appelée id
(qui est ce que je veux). Cependant, la question est la guid
colonne est une INT(11)
avec incrément automatique activée. Donc, je dois exécuter une commande supplémentaire:
change_column :global_feeds, :guid, :string, :limit => 25
Semble un peu compliqué d'avoir de gros exécuter deux commandes SQL pour obtenir ce que je pense qui devrait être possible dans une.
Des suggestions sur la façon d'optimiser ce?
OriginalL'auteur Ryan | 2011-01-22
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous utilisez mySQL, voici donc ce que vous pouvez essayer
Si vous n'êtes pas sur mySQL, vous devez modifier la requête dans le
execute
de commande pour travailler sur votre moteur de base de données. Je ne sais pas si vous pouvez le faire sur SQLite. Et n'oubliez pas de mettre cette ligne quelque part dans global_feed.rb modèle:De toute façon, vous obtenez les la plupart hors des Rails pendant que vous êtes collant à ses conventions. Modification de la clé primaire nom et le type peut-être pas une très bonne idée.
Je suppose que vous ne pouvez pas le faire en une seule opération, mais je suppose qu'il n'y a rien de mal à cela. Il est parfaitement ok pour la migration d'avoir deux états pour un peu plus complexes.
Aussi je ne suis pas sûr si ActiveRecord fonctionne très bien avec non entier clés primaires.
Je vais voter pour toi, juste pour l'effort maxt3r. Merci d'essayer.
Je suis tombé sur cette question avec un schéma j'ai hérité; j'ai essayé à peu près toutes les combinaisons possibles à l'aide de
primary_key
et la plupart des autres propositions dans ce et d'autres questions connexes. Sur Les Rails 3.2.x avec MySQL cette solution était la seule qui a fonctionné. Une question clé qui doit être pris en compte:rake db:schema:dump
n'entraînera pas le besoin de sortie (db:structure:dump
est ok). En écho @MaxAlFarakh commentaires: modification de la clé primaire nom et le type n'est pas une bonne idée 😐OriginalL'auteur Max Al Farakh
Dans les Rails 4 que vous pouvez faire;
cela ne devrait pas être une chaîne de caractères, mysql avec l'uuid doit être un fichier binaire(16)
Il fonctionne dans les Rails 5 🙂
Curieusement, il ne fonctionne pas pour moi dans les Rails 5
Vérifié qu'il fonctionne sur des rails 5
OriginalL'auteur kakoni
Vous avez besoin d'utiliser #colonne à la place de #chaîne de caractères. Par exemple:
Noter que le
varchar
type n'est pas portable à des bases de données MySQL.syntax error, unexpected '(', expecting keyword_end t.column :guid, :varchar(26), :null => false
Avec elle, pointant à la parenthèse à la fin de varcharVous avez raison. Utilisation
"varchar(25)"
au lieu de:varchar(25)
.Vous auriez aussi pu juste utilisé le
:string
type etlimit: 25
comme une option pour cet exemple.OriginalL'auteur Philip Wernersbach
Cela est possible dans Rails 3. essayez:
découvrez ce gist pour une excellente solution pour utiliser les Uuid comme clé primaire col: https://gist.github.com/937739
Voir la réponse de @kakoni
OriginalL'auteur Jordan Sitkin
Dans les Rails 5, pour thoes qui avez des problème de
ArgumentError: Index name '*' on table '*' already exists
quandrails db:setup
avec la migration comme de @kakoni, les ouvrages suivants, pour moiPour plus d'informations, consultez create_table.
OriginalL'auteur hxpax