PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bisakah saya menulis fungsi PostgreSQL di Ruby on Rails?

Ini bagian dari pertanyaan Anda:

Saya tahu kita dapat membuatnya secara manual di PostgreSQL, tetapi "keajaiban" dengan Rekaman Aktif adalah database dapat dibuat ulang dengan semua model.

memberi tahu saya bahwa Anda benar-benar mencari cara untuk mengintegrasikan fungsi PostgreSQL dengan proses migrasi Rails normal dan tugas Rake seperti db:schema:load .

Menambahkan dan menghapus fungsi dalam migrasi itu mudah:

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

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

Anda perlu menggunakan up yang terpisah dan down metode alih-alih satu change metode karena ActiveRecord tidak akan tahu bagaimana menerapkan apalagi membalikkan pembuatan fungsi. Dan Anda menggunakan connection.execute untuk memasukkan definisi fungsi mentah ke PostgreSQL. Anda juga dapat melakukannya dengan reversible di dalam 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

tapi menurut saya itu lebih berisik daripada up dan down .

Namun, schema.rb dan tugas Rake biasa yang bekerja dengan schema.rb (seperti db:schema:load dan db:schema:dump ) tidak akan tahu apa yang harus dilakukan dengan fungsi PostgreSQL dan hal-hal lain yang tidak dimengerti ActiveRecord. Ada cara untuk mengatasinya, Anda dapat memilih untuk menggunakan structure.sql file alih-alih schema.rb dengan menyetel:

config.active_record.schema_format = :sql

di config/application.rb your Anda mengajukan. Setelah itu, db:migrate akan menulis db/structure.sql file (yang hanya merupakan dump SQL mentah dari database PostgreSQL Anda tanpa data Anda) alih-alih db/schema.rb . Anda juga akan menggunakan tugas Rake yang berbeda untuk bekerja dengan structure.sql :

  • db:structure:dump bukannya db:schema:dump
  • db:structure:load bukannya db:schema:load

Segala sesuatu yang lain harus bekerja sama.

Pendekatan ini juga memungkinkan Anda menggunakan hal-hal lain dalam database Anda yang ActiveRecord tidak akan mengerti:PERIKSA batasan, pemicu, default kolom yang tidak sederhana, ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ratakan pasangan kunci/nilai gabungan dari bidang JSONB?

  2. Alternatif PGTune - Konfigurasi PostgreSQL ClusterControl

  3. PostgreSQL Berjalan Lambat? Tips &Trik Menuju Sumbernya

  4. Bagaimana clock_timestamp() Bekerja di PostgreSQL

  5. psql:server menutup koneksi secara tidak terduga