sql >> Databasteknik >  >> RDS >> PostgreSQL

Kan jag skriva PostgreSQL-funktioner på Ruby on Rails?

Denna del av din fråga:

Jag vet att vi kan skapa det manuellt i PostgreSQL, men "magin" med Active Record är att databasen kan återskapas med alla modeller.

säger mig att du verkligen letar efter ett sätt att integrera PostgreSQL-funktioner med den normala Rails-migreringsprocessen och Rake-uppgifter som db:schema:load .

Det är enkelt att lägga till och ta bort funktioner i migrering:

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

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

Du måste använda separat up och down metoder istället för en enda change metod eftersom ActiveRecord inte har någon aning om hur man tillämpar än mindre omvända en funktionsskapande. Och du använder connection.execute för att mata den råa funktionsdefinitionen till PostgreSQL. Du kan också göra detta med en reversible inuti 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 jag tycker att det är bullrigare än up och down .

Men schema.rb och de vanliga Rake-uppgifterna som fungerar med schema.rb (som db:schema:load och db:schema:dump ) kommer inte att veta vad de ska göra med PostgreSQL-funktioner och andra saker som ActiveRecord inte förstår. Det finns dock en väg runt detta, du kan välja att använda en structure.sql fil istället för schema.rb genom att ställa in:

config.active_record.schema_format = :sql

i din config/application.rb fil. Efter det, db:migrate kommer att skriva en db/structure.sql fil (som bara är en rå SQL-dump av din PostgreSQL-databas utan dina data) istället för db/schema.rb . Du kommer också att använda olika Rake-uppgifter för att arbeta med structure.sql :

  • db:structure:dump istället för db:schema:dump
  • db:structure:load istället för db:schema:load

Allt annat borde fungera likadant.

Det här tillvägagångssättet låter dig också använda andra saker i din databas som ActiveRecord inte förstår:KONTROLLERA begränsningar, utlösare, oenkla kolumnstandardvärden, ...



  1. android.database.sqlite.SQLiteException:nära s:syntaxfel (kod 1):,

  2. ODBC-fråga på MS SQL Server returnerar endast de första 255 tecknen i PHP PDO (FreeTDS)

  3. Oracle SQL:Använd sekvens i infogning med Select Statement

  4. Entity Framework 6 - Tidsfrågor