Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Rails xây dựng một câu lệnh MySQL như thế nào?

thử sql?

Nếu chỉ một câu lệnh này và nó gây ra sự cố sản xuất, bạn có thể bỏ qua trình tạo truy vấn ngay bây giờ không? Nói cách khác, trong thời gian ngắn hạn, bạn chỉ cần tự viết SQL. Điều này sẽ giúp bạn mất một chút thời gian.

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

ARel / MySQL giải thích?

Rails có thể giúp giải thích những gì MySQL đang cố gắng thực hiện:

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

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

Có lẽ bạn có thể phát hiện ra sự khác biệt nào đó giữa các truy vấn đang thành công và không thành công, chẳng hạn như cách explain sử dụng chỉ mục hoặc tối ưu hóa.

đá quý mysql2?

Bạn có thể thử đổi từ đá quý mysql sang đá quý mysql2 không? Bạn gặp thất bại gì khi chuyển sang đá quý mysql2?

biến động?

Có lẽ có điều gì đó khác đang thay đổi băm tham số, vì vậy bạn sẽ thấy nó khi in nó, nhưng nó bị thay đổi khi truy vấn chạy?

Hãy thử gán biến ngay khi bạn nhận được tham số:

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

không phải là băm params?

Bạn đã viết "Có nghĩa là Rails không chuyển trong params [:artist_id] mà rõ ràng là trong params hash." Tôi không nghĩ đó là vấn đề-- Tôi mong rằng bạn đang nhìn thấy điều này vì Rails đang sử dụng dấu "?" như một trình giữ chỗ cho một tuyên bố đã chuẩn bị.

Để tìm hiểu, hãy chạy các lệnh do @Mori gợi ý và so sánh chúng; chúng phải giống nhau.

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

báo cáo chuẩn bị?

Có thể là sự cố bộ đệm ẩn câu lệnh đã chuẩn bị sẵn, khi truy vấn thực sự được thực thi.

Đây là mã không thành công-- và có một cảnh báo lớn.

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

Hãy thử định cấu hình cơ sở dữ liệu của bạn để tắt các câu lệnh đã chuẩn bị, để xem điều đó có tạo nên sự khác biệt hay không.

Trong ./config/database.yml của bạn tệp:

production:
   adapter: mysql
   prepared_statements: false
   ...

lỗi với câu lệnh chuẩn bị?

Có thể có sự cố khi Rails bỏ qua cài đặt này. Nếu bạn muốn biết thêm nhiều điều về nó, hãy xem cuộc thảo luận và sửa lỗi này của Jeremey Cole và Aaron: https://github.com/rails/rails/pull/7042

Heroku có thể bỏ qua cài đặt này. Đây là một cách bạn có thể thử ghi đè Heroku bằng cách vá thiết lập ready_statements: https://github.com / rails / rails / Problem / 5297

xóa bộ nhớ cache truy vấn?

Thử xóa ActiveRecord QueryCache để xem điều đó có tạo nên sự khác biệt không:

config.middleware.delete ActiveRecord::QueryCache

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

thử postgres?

Nếu bạn có thể thử Postgres, điều đó cũng có thể làm sáng tỏ. Đó có thể không phải là giải pháp lâu dài cho bạn, nhưng nó sẽ tách biệt vấn đề với 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. MySQL Tham gia và nhận tất cả các quan hệ ngay cả khi 0

  2. lỗi thời gian chạy:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

  3. mysql_real_escape_string là không xác định

  4. PHP MySQL INSERT giá trị trả về với một lần thực thi truy vấn

  5. Có thể tải cơ sở dữ liệu trong RAM không?