Как сделать ALTER EXTENSION с базой данных Heroku Postgres?
Я использую apartment
gem для моего SaaS (построенного с Ruby on Rails) и одним из его требований является необходимость установки hstore
Расширение PostgreSQL через выделенную схему (то есть: shared_extensions
), не по умолчанию public
схемы.
Heroku позволяет hstore
по умолчанию; Однако он установлен в public
схемы. Когда я пытался сделать:
ActiveRecord::Base.connection.execute("ALTER EXTENSION hstore SET SCHEMA hstore;")
консоль вернулась:
(3.6ms) ALTER EXTENSION hstore SET SCHEMA hstore;
PG::Error: ERROR: must be owner of extension hstore
В настоящее время невозможно на стороне кода обойтись hstore
расширение устанавливается на public
поэтому я определенно должен найти способ поставить hstore
расширение на shared_extensions
схемы.
Будет ли способ сделать это на Heroku? Благодарю.
2 ответа
Оказывается, я не могу сделать ALTER EXTENSION hstore SET SCHEMA hstore;
на Heroku. Я задокументировал обходной путь здесь
- присоединять
?schema_search_path=public,hstore
на вашDATABASE_URL
переменная окружения, этим вам не нужно пересматриватьdatabase.yml
файл (что невозможно, так как Heroku восстанавливает совершенно другой и неизменныйdatabase.yml
свой на каждом развертывании) - Бежать
heroku pg:psql
из вашей командной строки - А потом
DROP EXTENSION hstore;
(Примечание: при этом будут удалены все столбцы, которые используютhstore
типа, поэтому действуйте с осторожностью; делайте это только со свежим экземпляром PostgreSQL) - Следующий:
CREATE SCHEMA IF NOT EXISTS hstore;
- В заключение:
CREATE EXTENSION IF NOT EXISTS hstore SCHEMA hstore;
и нажмите ввод (\q
выходить)
Менее разрушительная альтернативная работа:
1.) Переведите ваше приложение в режим обслуживания:
heroku maintenance:on -a [app-name]
2.) Сделайте резервную копию вашей базы данных: ВСЕГДА ПОДНИМАЙТЕ ЕГО:)
heroku pg:backups capture -a [app-name]
3.) Скопируйте вашу базу данных локально:
heroku pg:pull [Database URL] mylocaldb -a [app-name]
4.) Теперь у вас есть локальная база данных, вы можете перемещать расширения без какого-либо уничтожения данных или столбцов, поскольку у вас есть локальный привилегированный пользователь:
ALTER EXTENSION "hstore" SET SCHEMA hstore;
5.) Теперь экспортируйте эту версию обратно в производство:
heroku pg:push mylocaldb [Database URL] -a [app-name]
6.) Выньте свое приложение из службы поддержки. режим, и теперь у вас есть расширения, установленные в общей схеме hstore.
7.) Вам все равно нужно будет выполнить шаг 1 ответа Ту Х., если вы находитесь на рельсах < 4.1
ИЛИ, если вы используете rails 4.1+, вы можете просто обновить файл database.yml:
schema_search_path: "public,hstore"
Это менее разрушительный способ получить то, что вы хотите, без лишних простоев.