sql >> Database teknologi >  >> RDS >> PostgreSQL

Kan jeg skrive PostgreSQL-funktioner på Ruby on Rails?

Denne del af dit spørgsmål:

Jeg ved, at vi kan oprette det manuelt i PostgreSQL, men "magien" med Active Record er, at databasen kan genskabes med alle modellerne.

fortæller mig, at du virkelig leder efter en måde at integrere PostgreSQL-funktioner med den normale Rails-migreringsproces og Rake-opgaver såsom db:schema:load .

Det er nemt at tilføje og fjerne funktioner i migreringer:

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

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

Du skal bruge separat up og down metoder i stedet for en enkelt change metode, fordi ActiveRecord ikke har nogen idé om, hvordan man anvender endsige vende en funktionsoprettelse. Og du bruger connection.execute at fodre den rå funktionsdefinition til PostgreSQL. Du kan også gøre dette med en reversible inde i 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

men jeg synes, det er mere støjende end up og down .

Men schema.rb og de sædvanlige Rake-opgaver, der fungerer med schema.rb (såsom db:schema:load og db:schema:dump ) ved ikke, hvad de skal gøre med PostgreSQL-funktioner og andre ting, som ActiveRecord ikke forstår. Der er dog en vej rundt om dette, du kan vælge at bruge en structure.sql fil i stedet for schema.rb ved at indstille:

config.active_record.schema_format = :sql

i din config/application.rb fil. Derefter db:migrate vil skrive en db/structure.sql fil (som kun er en rå SQL-dump af din PostgreSQL-database uden dine data) i stedet for db/schema.rb . Du vil også bruge forskellige Rake-opgaver til at arbejde med structure.sql :

  • db:structure:dump i stedet for db:schema:dump
  • db:structure:load i stedet for db:schema:load

Alt andet burde fungere på samme måde.

Denne tilgang giver dig også mulighed for at bruge andre ting i din database, som ActiveRecord ikke forstår:KONTROLLER begrænsninger, udløsere, ikke-simple-mindede kolonnestandarder, ...



  1. Sikkerhedskopier/eksportér en database fra SSH

  2. Sådan bevarer du data i en dockeriseret postgres-database ved hjælp af volumener

  3. Sådan rettes "Partitionsskemaet '...' har ikke nogen næste brugt filgruppe" i SQL Server

  4. enkelt fast tabel med flere kolonner vs fleksible abstrakte tabeller