Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana Rails membangun pernyataan MySQL?

coba sql?

Jika hanya satu pernyataan ini, dan itu menyebabkan masalah produksi, dapatkah Anda mengabaikan generator kueri untuk saat ini? Dengan kata lain, untuk jangka yang sangat pendek, cukup tulis SQL sendiri. Ini akan memberi Anda sedikit waktu.

# All on one line:
Artist.find_by_sql
  "SELECT `artists`.* FROM `artists` 
   WHERE `artists`.`id` = #{params[:artist_id].to_i} LIMIT 1"

Arel/MySQL jelaskan?

Rails dapat membantu menjelaskan apa yang coba dilakukan MySQL:

Artist.find(params[:artist_id]).explain

http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/

Mungkin Anda dapat menemukan beberapa perbedaan antara kueri yang berhasil vs. gagal, seperti cara explain menggunakan indeks atau pengoptimalan.

permata mysql2?

Bisakah Anda mencoba mengubah dari permata mysql ke permata mysql2? Kegagalan apa yang Anda dapatkan saat beralih ke permata mysql2?

volatilitas?

Mungkin ada hal lain yang mengubah hash params dengan cepat, jadi Anda melihatnya saat mencetaknya, tetapi berubah saat kueri dijalankan?

Coba tetapkan variabel segera setelah Anda menerima parameter:

artist_id = params[:artist_id]
... whatever code here...
@artist = Artist.find(artist_id)

bukan hash params?

Anda menulis "Arti Rails tidak lewat di params[:artist_id] yang jelas-jelas ada di hash params." Saya rasa bukan itu masalahnya-- Saya berharap Anda melihat ini karena Rails menggunakan "?" sebagai pengganti untuk pernyataan yang disiapkan.

Untuk mengetahuinya, jalankan perintah yang disarankan oleh @Mori dan bandingkan; mereka harus sama.

Article.find(42).to_sql
Article.find(params[:artist_id]).to_sql

pernyataan yang sudah disiapkan?

Bisa menjadi masalah cache pernyataan yang disiapkan, ketika kueri benar-benar dieksekusi.

Ini kode yang gagal-- dan ada peringatan besar.

begin
  stmt.execute(*binds.map { |col, val| type_cast(val, col) })
rescue Mysql::Error => e
  # Older versions of MySQL leave the prepared statement in a bad
  # place when an error occurs. To support older mysql versions, we
  # need to close the statement and delete the statement from the
  # cache.
  stmt.close
  @statements.delete sql
  raise e
end

Coba konfigurasikan database Anda untuk menonaktifkan pernyataan yang sudah disiapkan, untuk melihat apakah ada perbedaan.

Di ./config/database.yml . Anda berkas:

production:
   adapter: mysql
   prepared_statements: false
   ...

bug dengan pernyataan yang sudah disiapkan?

Mungkin ada masalah dengan Rails yang mengabaikan pengaturan ini. Jika Anda ingin tahu lebih banyak tentangnya, lihat diskusi dan perbaikan bug ini oleh Jeremey Cole dan Aaron:https://github.com/rails/rails/pull/7042

Heroku mungkin mengabaikan pengaturan. Berikut cara Anda dapat mencoba mengganti Heroku dengan menambal penyiapan ready_statements:https://github.com /rails/rails/issues/5297

hapus cache kueri?

Coba hapus ActiveRecord QueryCache untuk melihat apakah itu membuat perbedaan:

config.middleware.delete ActiveRecord::QueryCache

http://edgeguides.rubyonrails.org/configuring.html#configuring-middle

coba postgres?

Jika Anda dapat mencoba Postgres, itu juga dapat menghapusnya. Itu mungkin bukan solusi jangka panjang untuk Anda, tetapi itu akan mengisolasi masalah ke MySQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klausa OUTPUT di MySQL

  2. Bisakah Anda menggunakan peningkatan otomatis di MySql tanpa itu menjadi Kunci utama?

  3. Manajemen akun pengguna, peran, izin, otentikasi PHP dan MySQL - Bagian 2

  4. Kueri mengunci tabel, tidak dapat mematikan proses itu

  5. Laravel Query Builder - masalah metode sum()