sql >> Database >  >> RDS >> PostgreSQL

Kan ik PostgreSQL-functies schrijven op Ruby on Rails?

Dit deel van je vraag:

Ik weet dat we het handmatig kunnen maken in PostgreSQL, maar de "magie" van Active Record is dat de database opnieuw kan worden gemaakt met alle modellen.

vertelt me ​​dat je echt op zoek bent naar een manier om PostgreSQL-functies te integreren met het normale Rails-migratieproces en Rake-taken zoals db:schema:load .

Het toevoegen en verwijderen van functies in migraties is eenvoudig:

def up
  connection.execute(%q(
    create or replace function ...
  ))
end

def down
  connection.execute(%q(
    drop function ...
  ))
end

Je moet aparte up . gebruiken en down methoden in plaats van een enkele change methode omdat ActiveRecord geen idee heeft hoe het moet worden toegepast, laat staan ​​dat het maken van een functie ongedaan wordt gemaakt. En je gebruikt connection.execute om de onbewerkte functiedefinitie naar PostgreSQL te voeren. Je kunt dit ook doen met een reversible binnen change :

def change
  reversible do |dir|
    dir.up do
      connection.execute(%q(
        create or replace function ...
      ))
    end
    dir.down do
      connection.execute(%q(
        drop function ...
      ))
    end
  end
end

maar dat vind ik luidruchtiger dan up en down .

Echter, schema.rb en de gebruikelijke Rake-taken die werken met schema.rb (zoals db:schema:load en db:schema:dump ) niet weten wat te doen met PostgreSQL-functies en andere dingen die ActiveRecord niet begrijpt. Er is echter een manier om dit te omzeilen, je kunt ervoor kiezen om een ​​structure.sql . te gebruiken bestand in plaats van schema.rb door in te stellen:

config.active_record.schema_format = :sql

in uw config/application.rb het dossier. Daarna db:migrate zal een db/structure.sql . schrijven bestand (dat slechts een onbewerkte SQL-dump is van uw PostgreSQL-database zonder uw gegevens) in plaats van db/schema.rb . Je zult ook verschillende Rake-taken gebruiken voor het werken met structure.sql :

  • db:structure:dump in plaats van db:schema:dump
  • db:structure:load in plaats van db:schema:load

Al het andere zou hetzelfde moeten werken.

Met deze aanpak kunt u ook andere dingen in uw database gebruiken die ActiveRecord niet begrijpt:CONTROLEER beperkingen, triggers, niet-eenvoudige kolomstandaarden, ...



  1. Hoe tijdgegevens uit een tekenreeks in SQL Server te extraheren of om te zetten?

  2. BadImageFormatException. Dit gebeurt bij het uitvoeren in 64-bits modus met de 32-bits Oracle-clientcomponenten geïnstalleerd

  3. Kunnen we parameters doorgeven aan een weergave in SQL?

  4. SQL NOT-operator voor beginners