🧚 Dengar! Beekeeper Studio adalah GUI database yang cepat, modern, dan open source Unduh
25 April 2025 Oleh Matthew Rathbone

Terkadang ActiveRecord saja tidak cukup. Mungkin Anda butuh query kompleks dengan banyak join, atau ingin memeras setiap bit performa dari database Anda. Saat itulah raw SQL sangat berguna.

Berikut semua yang perlu Anda ketahui tentang menjalankan raw SQL di Rails - mulai dari dasar-dasarnya hingga cara menghindari jebakan umum.

Kapan Anda Benar-Benar Butuh Raw SQL

Sebagian besar waktu, ActiveRecord sudah cukup. Tapi berikut skenario nyata di mana raw SQL masuk akal:

  • Agregasi kompleks - Saat Anda butuh window function, CTE, atau operasi GROUP BY yang kompleks
  • Query yang kritis terhadap performa - Saat SQL yang dihasilkan ActiveRecord tidak efisien
  • Fitur khusus database - Menggunakan operator JSONB milik PostgreSQL, pencarian FULLTEXT milik MySQL, dll.
  • Operasi massal - Update massal yang akan lambat jika dilakukan dengan panggilan ActiveRecord satu per satu

Mari langsung ke bagian praktisnya.

Contoh Nyata: Analitik Pengguna

Misalnya Anda sedang membangun analitik pengguna dan perlu mencari pengguna yang mendaftar dalam 7 hari terakhir, beserta jumlah post mereka. Begini caranya:

Tiga Cara Menjalankan Raw SQL

Rails memberi Anda beberapa opsi untuk menjalankan raw SQL. Berikut yang utama:

1. connection.execute - Untuk Hasil Mentah

Gunakan ini saat Anda menginginkan hasil mentah dari database:

sql = <<~SQL
  SELECT 
    u.id, u.name, u.email,
    COUNT(p.id) as post_count
  FROM users u
  LEFT JOIN posts p ON p.user_id = u.id
  WHERE u.created_at >= NOW() - INTERVAL '7 days'
  GROUP BY u.id, u.name, u.email
  ORDER BY post_count DESC
SQL

result = ActiveRecord::Base.connection.execute(sql)
result.each do |row|
  puts "#{row['name']}: #{row['post_count']} posts"
end

2. find_by_sql - Untuk Objek Model

Saat Anda ingin mendapatkan objek ActiveRecord yang sebenarnya:

users = User.find_by_sql([
  "SELECT * FROM users WHERE created_at >= ? AND status = ?",
  7.days.ago, 'active'
])

users.each { |user| puts user.email }

3. pluck dengan Arel - Pendekatan Hibrida

Untuk kasus sederhana, Anda tetap bisa memakai sedikit raw SQL bersama ActiveRecord:

User.where("created_at >= ?", 7.days.ago)
    .pluck("name, email, DATE(created_at) as signup_date")

Jangan Sampai Diretas: Mencegah SQL Injection

Ini sangat penting - jangan pernah menyisipkan input pengguna langsung ke dalam string SQL. Ini cara yang salah:

# DON'T DO THIS - vulnerable to SQL injection
email = params[:email]
User.find_by_sql("SELECT * FROM users WHERE email = '#{email}'")

Sebaliknya, gunakan query berparameter:

# Safe approach with parameters
email = params[:email]
User.find_by_sql(["SELECT * FROM users WHERE email = ?", email])

# Or use connection.quote for raw execute
email = params[:email]
sanitized_email = ActiveRecord::Base.connection.quote(email)
result = ActiveRecord::Base.connection.execute("SELECT * FROM users WHERE email = #{sanitized_email}")

Parameter otomatis di-escape dan aman. Selalu gunakan parameter.

Tips Performa

Raw SQL sering kali soal performa, jadi berikut beberapa tips pro:

Gunakan Beekeeper Studio untuk menganalisis query Anda - sangat cocok untuk menguji dan mengoptimalkan SQL sebelum dimasukkan ke aplikasi Rails Anda.

Tambahkan index pada kolom yang Anda gunakan untuk filter atau join:

# In a migration
add_index :users, :created_at
add_index :posts, [:user_id, :status]

Gunakan EXPLAIN untuk memahami performa query:

ActiveRecord::Base.connection.execute("EXPLAIN ANALYZE #{your_sql}")

Pertimbangkan view database untuk query kompleks yang dapat dipakai ulang, alih-alih mengulang raw SQL di mana-mana.

Kesimpulan

Raw SQL di Rails ibarat pisau tajam - ampuh saat dibutuhkan, tapi harus digunakan dengan hati-hati. Gunakan untuk query kompleks, optimasi performa, dan fitur khusus database yang tidak bisa ditangani ActiveRecord.

Ingat:

  • Selalu gunakan query berparameter untuk mencegah SQL injection
  • Uji query Anda terlebih dahulu dengan tool seperti Beekeeper Studio
  • Jangan tinggalkan ActiveRecord sepenuhnya - gunakan raw SQL secara strategis

Bacaan Lanjutan

Punya pertanyaan seputar manajemen database atau optimasi SQL? Beekeeper Studio memudahkan Anda menjelajahi data dan menyempurnakan query sebelum di-deploy.

Beekeeper Studio Adalah GUI Database Gratis & Open Source

Tool query & editor SQL terbaik yang pernah saya pakai. Semua yang saya butuhkan untuk mengelola database ada di sini. - ⭐⭐⭐⭐⭐ Mit

Beekeeper Studio cepat, intuitif, dan mudah digunakan. Beekeeper mendukung banyak sekali database, dan berjalan mulus di Windows, Mac, dan Linux.

Versi Linux Beekeeper punya fitur 100% lengkap, tanpa potong kompas, tanpa kompromi fitur.

Apa Kata Pengguna tentang Beekeeper Studio

★★★★★
"Beekeeper Studio sepenuhnya menggantikan workflow SQL lama saya. Cepat, intuitif, dan membuat kerja dengan database kembali menyenangkan."
— Alex K., Database Developer
★★★★★
"Saya sudah mencoba banyak GUI database, tapi Beekeeper punya keseimbangan sempurna antara fitur dan kesederhanaan. Langsung jalan begitu saja."
— Sarah M., Full Stack Engineer

Siap Meningkatkan Workflow SQL Anda?

download Unduh Gratis