Odoo. Миграции

У меня есть некоторые модули, которые расширяют дополнения Odoo. Например, модели в my_module, которые расширяют crm:

class Lead(models.Model):
    _inherit = 'crm.lead'
    # exmaple fields
    field_1 = fields.Char(...)
    field_2 = fields.Many2one(...)
    # ... field 99


class Stage(models.Model):
    _inherit = 'crm.stage'
    # exmaple fields
    field_1 = fields.Char(...)
    field_2 = fields.Many2one(...)
    # ... field 99

Такая же ситуация для модулей, которые расширяют hr, продукт и т.д. Мне нужно внести некоторые изменения в модели. Например, в my_module_1 мне нужно изменить пару полей (тип, отношение), в my_module_2, чтобы удалить несколько полей и т.д. Конечно, мне также нужно изменить представления каждого модуля. И, конечно же, у меня есть собственные модели, которые имеют зависимости от моделей из разных приложений/модулей. Но у меня есть данные о производстве, которые необходимо хранить. Я не нашел никакой информации о миграции (или синхронизации модулей) в Odoo.

Мой вопрос: Каков наилучший способ обновления модулей/приложений на производстве (если у нас много изменений в полях моделей и представлений)? Спасибо заранее.

Ответы

Ответ 1

Сначала вам нужно сбросить производственную базу данных, а затем восстановить ее в локальной системе.

После восстановления в локальной системе создайте свои собственные модули, чтобы расширить существующие функции модели.

Установите разработанные модули в локальной системе (восстановленная база данных) и просмотрите сделанные вами изменения. Если все отлично с существующими данными, то установите этот модуль в производственную базу данных.

Чтобы выгрузить производственную базу данных, выполните следующую команду в postgres. Команда: pg_dump dbname > outfile Пример: pg_dump prod_db > prod_db.sql

Перед восстановлением базы данных вам необходимо создать новую базу данных в локальной системе. Для создания новой базы данных выполните приведенную ниже команду, command: createdb --owner owner_name --encoding utf-8 dbname Пример: createdb --owner odoo --encoding utf-8 prod_db

Чтобы восстановить производственную базу данных, выполните следующую команду в postgres. Команда: psql dbname < бесконечный путь Пример: pg_dump prod_db > prod_db.sql

Ответ 2

Возможно, есть некоторые инструменты для миграции в корпоративной версии Odoo, но я не нашел никакой информации об этом. Поэтому решение, которое я использую, - это делать все вручную. Шаг за шагом, внимательно. Если вы знаете лучший способ, дайте мне знать.

Например. Если нам нужно удалить некоторые поля:

  • Удалить поля из моделей и представлений в вашем модуле/приложении.
  • Остановить openerp-сервер. Запустите sql, который отбрасывает наши столбцы.
  • Разверните на модели новые версии и представления. Запустить openerp-сервер.
  • Активировать режим разработчика → Перейти к настройкам → найти модуль/приложение → нажмите Обновить (обновить)

Если вам нужно изменить тип/отношение полей:

  • Добавьте поле (с новым типом/отношением) к вашей модели.
  • Подготовьте sql script, который перенесет данные из старого столбца в новый столбец/таблицы.
  • Удалите старое поле из вашей модели и представлений.
  • Остановить openerp-сервер. Запустите sql script, отбросьте старые столбцы.
  • Разверните на модели новые версии и представления. Запустить openerp-сервер.
  • Активировать режим разработчика → Перейти к настройкам → найти модуль/приложение → нажмите Обновить (обновить)

Будьте осторожны при изменении отношений (one2many, many2many). Сделайте дампы и версии приложений. Проверяйте свои модификации на локальном компьютере с помощью db от производства несколько раз.

Еще одна вещь о новых полях с отношениями. Например, у меня есть module_1, который зависит от crm. module_2, который зависит от модуля_1 и т.д. Мне нужно добавить некоторые поля в модели crm и показать их в модуле_1. В module_2 мне нужно показать новые поля из моих пользовательских моделей в модуле_1.

Мы можем добавить все новые поля в модели и представления в наши модули. Остановите сервер и запустите сервер с параметром - update следующим образом:

./openerp-server --update=all

В этом случае все модули будут обновлены. Если нам нужно обновить только модули, которые зависят от crm, нам нужно просто обновить crm:

./openerp-server --update=crm

Ответ 3

Перезапустите сервер из командной строки один раз с флагами -u и -d например.

sudo service odoo stop
/path/to/odoo/odoo.py -d <your_db_name> -u custom_module1,custom_module2

Если вы имеете дело с производственным сервером, я бы проверил это локально, на вашей машине разработки со свежим дампом производственной БД, убедитесь, что он работает, настройте его, если необходимо (например, для некоторых полей могут потребоваться значения по умолчанию), проверьте его снова на еще одном новом дампе до тех пор, пока все, что мне нужно сделать, это перезагрузить сервер, как указано выше, чтобы произошли изменения. Как только это произойдет, создайте резервную копию базы данных, хранилища данных и даже затронутых модулей на рабочем сервере, загрузите новый модуль (модули) и перезапустите производственный сервер, как указано выше (без демпинга баз данных из теста на производство здесь) обновление модуля должно заботиться изменений в базе данных.

Если вы пытаетесь существенно изменить структуру таблицы (например, изменить тип данных полей) и сохранить данные в таблицах, единственный способ, которым я могу это сделать, - создать новые поля сначала с новым типом данных, заполнить их с данными из старых полей (либо напрямую с запросами postgres, либо в вашем "промежуточном модуле версии" ), и это действительно зависит от изменений, изменение от выбора до many2one включает в себя добавление значений выбора в новую таблицу, две очень разные вещи из базы данных точка зрения, действительный тип поля в таблице будет целым числом, идентификатор из строки, которая содержит значение выбора в реляционной таблице...

После заполнения новых полей сделайте окончательную версию модуля удалением всех полей, которые вам больше не нужны (сохраните другую версию для производственной базы данных).

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

Я также посмотрел бы на мои таблицы postgres после того, как все это будет сделано, некоторые поля могут быть там, даже если новый модуль их не использует.

Извините, я не знаю более простого, более автоматического способа сделать это, просто слишком много переменных...

Ответ 4

В соответствии с вашим примером, я считаю, что вы уже знаете, как добавить новое поле в существующую модель.

Я все еще не понимаю, почему кто-то захочет удалить поле из существующей модели - это будет/будет больше проблем, чем это стоит (если есть веская причина, пожалуйста, позвольте мне знаю). Это также применяется при попытке изменить типы полей. С учетом этого вы можете легко удалить/заменить/скрыть существующее поле в представлении, что, по сути, должно достичь того же результата.

https://www.odoo.com/forum/help-1/question/add-remove-fields-to-inherited-custom-module-72945

<record model="ir.ui.view" id="enter_an_id_here">
    <field name="name">some.text.here.form</field>
    <field name="model">crm.lead</field>
    <field name="inherit_id" ref="crm.external_id_here" />
    <field name="arch" type="xml">
        <field name="name" position="after">
            <field name="your_field_name"/>
        </field>
    </field>
</record>

Вы также говорили о переносе данных с иждивенцев на другую модель с помощью copy/paste. Это не требуется, поскольку вы можете просто получить доступ к данным в существующей модели с помощью ссылки на прямой объект/поле или с помощью связанного поля.

связанное поле в odoo?

new_field = fields.Char(string='String', related='product_id.name')
or inside python
value = self.product_id.name

Я не буду ссылаться ни на что, связанное с установкой командных команд модуля/сервера, поскольку другие ответы здесь уже рассмотрели эти аспекты.