Warum erstellt add_index mit 'gin' stattdessen einen 'btree' Index?

9

Ich bin auf PostgreSQL 9.3.4 und Rails 4.0.4 .

Ich füge eine "tags" -Spalte und den entsprechenden gin index hinzu (oder zumindest frage ich nach einem).

%Vor%

Überprüfen Sie die Ergebnisse über psql :

%Vor%

Beachten Sie, dass der Index "Tags" vom Typ btree ist - während ich nach gin gefragt habe.

Erstellen Sie nun manuell einen Index, um anzuzeigen, dass gin verfügbar ist:

%Vor%

Tatsächlich ist gin verfügbar.

Zur Zeit verwende ich diese Problemumgehung mit Raw SQL, möchte aber wissen, warum die oben beschriebene Vorgehensweise fehlschlägt:

%Vor%

Beachten Sie, dass es einen weiteren Haken gibt!

Es stellt sich heraus, dass db/schema.rb nicht gin als Indextyp hat:

%Vor%

Mögliche Zwischenlösung:

%Vor%

Warnung!

Bis dieser Fehler behoben ist, müssen Sie Änderungen an db/schema.rb überprüfen, wenn Sie eine Migration ausführen, da alle zukünftigen Migrationen using: :gin von der add_index -Zeile entfernen.

    
user664833 20.04.2014, 17:23
quelle

1 Antwort

4

Wie bereits erwähnt, müssen Sie Ihr Schemaformat auf :sql setzen, indem Sie diese Zeile in Ihrem config/application.rb :

hinzufügen (oder ändern) %Vor%

Wie in dem Rails Migrations-Handbuch erläutert, besteht der Grund darin, dass ein GIN-Index für Postgres spezifisch ist. Wenn Sie datenbankspezifische Elemente verwenden, kann schema.rb sie nicht erneut erstellen.

Hier ist ein Zitat aus dem Rails-Guide:

  

Es gibt jedoch einen Kompromiss: db / schema.rb kann keine datenbankspezifischen Elemente wie Trigger oder gespeicherte Prozeduren ausdrücken. Während einer Migration können Sie benutzerdefinierte SQL-Anweisungen ausführen, der Schema-Dumper kann diese Anweisungen nicht aus der Datenbank wiederherstellen. Wenn Sie Funktionen wie diese verwenden, sollten Sie das Schemaformat auf Folgendes setzen: sql.

Sobald Sie das :sql -Format verwenden, wird Ihr Schema nun in structure.sql statt in schema.rb gespeichert. Beide Dateien können nebeneinander existieren, aber nur structure.sql wird aktualisiert und von der App verwendet, wenn Ihr Format auf :sql eingestellt ist.

    
monfresh 19.03.2015 02:57
quelle