2010-02-02 3 views
9

Ich schreibe eine Migration, um eine Nicht-Rails-Anwendung in das richtige Format für Schienen zu konvertieren - eine der Tabellen hat aus irgendeinem Grund kein automatisches Inkrement für die ID-Spalte. Gibt es eine schnelle Möglichkeit, es während einer Migration einzuschalten, vielleicht mit change_column oder etwas?Erstelle fehlende Autoinkrementattribute mit Schienenmigration

Antwort

7

Sie müssen eine SQL-Anweisung ausführen.

statement = "ALTER TABLE `users` CHANGE `id` `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT" 
ActiveRecord::Base.connection.execute(statement) 

Beachten Sie, dass dies nur ein Beispiel ist. Die endgültige SQL-Anweisungssyntax hängt von der Datenbank ab.

+0

dank viel @Simone Carletti, verschwendet ganzen Tag um das Problem zu lösen, aber es ist nun gelöst und dank DGM auch für postin g Frage speziell für meinen Fall. Kannst du mir beide eine Idee zum Schreiben von Stored Procedures in Rails 4.1 auf originelle Weise geben, in der Hoffnung, dass ihr mir wieder helfen könnt? Glückliche Kodierung. – roarfromror

+0

Ich weiß nicht viel Aktivität in Schienen mit gespeicherten Prozeduren - einige Ecken der Schienen haben wenig Nutzen für die mächtigeren Seiten von SQL, andere wissen einfach nicht ... sowieso, zumindest könnte man verwenden Dieselbe Form, um das SQL zu schreiben, um die gespeicherte Prozedur zu erstellen. – DGM

6

Wenn Sie auf Postgesql sind, wird eine einzige Anfrage es nicht schaffen. Sie müssen eine neue Sequenz in der Datenbank erstellen.

create sequence users_id_seq; 

dann die id-Spalte zu Ihrer Tabelle hinzufügen

alter table users 
    add id INT UNIQUE; 

Dann

alter table users 
    alter column id 
     set default nextval('users_id_seq'); 

Dann bevölkern die id-Spalte den Standardwert für die ID festgelegt. Dies kann sehr lang sein, wenn die Tabelle viele Zeilen

update users 
    set id = nextval('users_id_seq'); 

this helps postgresql Benutzer hat ...

+0

Danke! Das ist sehr hilfreich! –

Verwandte Themen