簡體   English   中英

讓Rails記錄Postgres內部*全部*的方法?

[英]Way to Get Rails to Log *All* Of Postgres Internals?

有沒有一種方法可以將SQL日志記錄設置為在Rails中超級詳細?

我對此表的primary_key字段進行了唯一性索引檢查,但似乎無法正常工作。 我想看看postgres在幕后實際上在做什么。 換句話說,我看到了INSERT語句,但是我也想看到它在插入之前執行的檢查的列表。

irb(main):006:0> SampleTable.create(primary_key: 'hi', archived_at: nil)


 (0.2ms)  BEGIN
  SampleTable Create (0.3ms)  INSERT INTO "sample_tables" ("primary_key", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["primary_key", "hi"], ["created_at", "2019-04-23 12:51:00.295952"], ["updated_at", "2019-04-23 12:51:00.295952"]]
   (6.0ms)  COMMIT
=> #<SampleTable id: 2, primary_key: "hi", archived_at: nil, created_at: "2019-04-23 12:51:00", updated_at: "2019-04-23 12:51:00">

如果您在談論唯一索引-檢查是postgres的內部功能,則rails會向它提供一個sql查詢,並且不知道它是如何處理的。

但是請注意, validates :some_field, uniqueness: true是非原子性的,容易出現競爭狀況,因為在rails的檢查和實際插入之間可能會發生另一個插入:

  1. 請求A開始記錄創建,檢查是否存在具有相同鍵的記錄
  2. 請求B開始相同的過程,並檢查不存在密鑰
  3. 請求A繼續插入
  4. 請求B繼續插入
  5. 兩個請求都檢查了該密鑰不存在,但是您在數據庫中有一個重復項

此驗證應由數據庫上的唯一索引支持,以便在出現競爭情況時,postgres將返回錯誤並拋出ActiveRecord::RecordNotUnique

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM