Почему я вижу `SET xmloption = content;` в моей структуре.sql? - PullRequest
3 голосов
/ 19 июня 2019

Я использую Rails 6 и недавно написал небольшую миграцию для добавления столбца в таблицу. Простые вещи:

class AddInstagramUsernameToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :instagram_username, :string
  end
end

Но заметил, что при запуске миграции я вижу следующую строку, добавленную в мою структуру.sql:

SET xmloption = content;

Я не особенно беспокоюсь об этом (по общему признанию документация , описывающая опцию, она выглядит довольно безобидной), но я не хотел бы, чтобы такая маленькая миграция изменила какие-либо вещи в meta postgres. Я попытался перейти на Rails 5, чтобы избавиться от этой линии, но не повезло. Я использую Postgres версии 10.8 и недавно не обновлялся.

В настоящее время я понятия не имею, что добавляет эту строку, и хотел бы избавиться от нее, если это возможно. Кто-нибудь знает, что вызывает это / как предотвратить это?

1 Ответ

2 голосов
/ 20 июня 2019

Rails не генерирует structure.sql - это фермы, которые работают со встроенным в PostgreSQL инструментом pg_dump. Согласно Руководству по рельсам миграции активной записи :

Если для формата схемы установлено значение :sql, структура базы данных будет выгружаться с помощью инструмента, специфичного для базы данных, в db/structure.sql. Например, для PostgreSQL используется утилита pg_dump.

Это pg_dump, которая генерирует эту строку в вашем structure.sql.

Причина, по которой это происходит, насколько я могу судить, заключается в том, что при восстановлении из файла pg_dump нельзя предполагать, что целевая база данных имеет тот же xmloption, что и исходная база данных. Без этой строки пользователь может столкнуться с проблемой, как описано в этом отчете об ошибке . Это изменение было включено в PostgreSQL 9.4.22, в частности commit 8ba48542 .

Нет возможности отключить это, и нет причин делать это.

...