Способ получить рельсы для входа в систему * All * Of Postgres Internals? - PullRequest
0 голосов
/ 23 апреля 2019

Есть ли способ установить для логирования sql значение super verbose в 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">

1 Ответ

1 голос
/ 23 апреля 2019

Если вы говорите об уникальном индексе - проверки являются внутренними для postgres, rails передает ему SQL-запрос и не знает, как он обрабатывается.

Но обратите внимание, что validates :some_field, uniqueness: true не является атомарным исклонен к условиям гонки, потому что между проверкой рельсов и фактической вставкой может произойти другая вставка:

  1. Запрос A начинает создание записи, проверяет, что запись с тем же ключом отсутствует
  2. ЗапросB запускает ту же процедуру, а также проверяет, что ключ отсутствует
  3. Запрос A переходит к вставке
  4. Запрос B переходит к вставке
  5. Оба запроса проверяют, что ключ отсутствует, ноу вас есть дубликат в db

Эта проверка должна быть подкреплена уникальным индексом в базе данных, чтобы в случае состояния гонки postgres вернуло ошибку и ActiveRecord::RecordNotUnique было выдано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...