НейроАгент

Восстановление базы данных Odoo 13: исправление KeyError company_id

Полное руководство по исправлению KeyError: 'company_id' в Odoo 13. Узнайте шаги восстановления для поврежденных баз данных, переустановки модулей и профилактических мер для защиты вашей производственной среды.

Вопрос

Повреждение базы данных Odoo 13: основные модули деинсталлированы и ошибка восстановления

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

Когда я попытался деинсталлировать и переустановить затронутые модули, появилась следующая ошибка:

2025-11-04 07:37:54,956 6424 ERROR prod_db odoo.modules.registry: Failed to load registry 
Traceback (most recent call last):
  File "/opt/odoo13/odoo/odoo/modules/registry.py", line 87, in new
    odoo.modules.load_modules(registry._db, force_demo, status, update_module)
  File "/opt/odoo13/odoo/odoo/modules/loading.py", line 437, in load_modules
    registry.setup_models(cr)
  File "/opt/odoo13/odoo/odoo/modules/registry.py", line 263, in setup_models
    model._setup_fields()
  File "/opt/odoo13/odoo/odoo/models.py", line 2749, in _setup_fields
    field.setup_full(self)
  File "/opt/odoo13/odoo/odoo/fields.py", line 433, in setup_full
    self._setup_related_full(model)
  File "/opt/odoo13/odoo/odoo/fields.py", line 486, in _setup_related_full
    field = target._fields[name]
KeyError: 'company_id'

Вопросы:

  1. Что могло привести к неожиданной деинсталляции основных модулей в Odoo 13?
  2. Как правильно восстановиться от ошибки “KeyError: ‘company_id’” при попытке переустановки модулей?
  3. Какие шаги следует предпринять для восстановления базы данных в рабочее состояние?

Буду благодарен за любые идеи и рекомендации.

НейроАгент

Ошибка KeyError: ‘company_id’ в базе данных Odoo 13

Ошибка KeyError: ‘company_id’ в вашей базе данных Odoo 13 обычно возникает, когда данные основных модулей повреждаются или когда ссылки на поля отсутствуют в схеме базы данных. Это часто происходит при неправильной деинсталляции модулей или при компрометации целостности базы данных, что оставляет после себя осиротевшие ссылки на поля, которые больше не существуют в их исходных модулях. Для восстановления вам потребуется выполнить ручные вмешательства в базу данных для очистки этих ссылок и восстановления отсутствующих определений полей.

Содержание

Понимание основных причин

Непредвиденная деинсталляция модулей

На основе результатов исследования существует несколько потенциальных причин непредвиденной самодеинсталляции основных модулей в Odoo 13:

Сценарии повреждения базы данных

  • Трассировка ошибки указывает на то, что проблема возникает во время загрузки модуля, когда Odoo пытается настроить поля и сталкивается с отсутствующим полем company_id
  • Это suggests, что либо определение поля было удалено из модели, либо модуль, содержащий это поле, был деинсталлирован без надлежащей очистки
  • Согласно обсуждениям на форуме Odoo, аналогичные ошибки KeyError часто возникают, когда модули деинсталлируются, но их ссылки на данные остаются в базе данных

Проблемы с цепочками зависимостей

  • Основные модули, такие как base, web или account, часто имеют взаимозависимые отношения
  • Когда один модуль в этой цепочке затрагивается, это может вызвать каскадные сбои
  • Проблема на GitHub #1118 показывает, как проблемы с модулем Multi-Company могут вызвать проблемы с KeyError во всей системе

Неправильное ручное вмешательство

  • Некоторые пользователи сообщают о случайном удалении моделей или полей через операции с базой данных
  • Обсуждение на Stack Overflow упоминает, что даже новички могут столкнуться с этой проблемой при внесении изменений в базу данных

Почему именно company_id?

Поле company_id особенно подвержено этим проблемам, потому что:

Многокомпанейская архитектура

  • В Odoo 13 поле company_id критически важно для функциональности многокомпанейской работы
  • На него ссылаются во многих модулях, включая учет, HR и CRM
  • Когда это поле становится недоступным, нарушается вся система многокомпанейской работы

Проблемы со ссылками на поля

  • Как объясняется в ответе на Stack Overflow, ошибка возникает, когда “связанное поле внутри модуля, имеющего company_id, указано в нем”
  • Это suggests, что какой-то пользовательский модуль или представление пытается получить доступ к полю company_id, но не может его найти

Немедленные шаги по восстановлению

Вмешательства на уровне базы данных

1. Подключитесь к PostgreSQL и проверьте целостность модели

bash
sudo su - postgres
psql your_database_name

2. Проверьте записи ir_model
Проверьте, существует ли модель, содержащая company_id, в базе данных:

sql
SELECT * FROM ir_model WHERE model = 'res.users';
SELECT * FROM ir_model WHERE model = 'account.move';

3. Ручная очистка осиротевших ссылок
Если модели отсутствуют, но ссылки остаются, вам потребуется их очистить. Согласно решению на форуме Odoo:

“Просто найдите эти идентификаторы и удалите их, и ошибка KeyError исчезнет.”

4. Проверьте отсутствие определений полей

sql
-- Проверьте, существует ли поле company_id в модели
SELECT * FROM ir_model_fields WHERE name = 'company_id' AND model = 'res.users';

Стратегия переустановки модулей

1. Определите затронутые модули
На основе трассировки ошибки и ваших знаний о том, что было деинсталлировано, определите, какие основные модули затронуты.

2. Процесс безопасной переустановки

  • Сначала попробуйте переустановить только модуль base с помощью веб-интерфейса Odoo или командной строки
  • Если это не сработает, переходите к ручным исправлениям в базе данных

3. Используйте оболочку Odoo для экстренных исправлений
Как показано в решении на Stack Overflow:

bash
sudo python3 /opt/odoo/odoo-bin shell -d your_database_name

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


Методы восстановления базы данных

Вариант 1: Ручной ремонт базы данных

Шаг 1: Создайте резервную копию текущей базы данных

bash
pg_dump your_database_name > backup_$(date +%Y%m%d_%H%M%S).sql

Шаг 2: Очистите проблемные ссылки

sql
-- Удалите осиротевшие ссылки на модели
DELETE FROM ir_model_data WHERE model NOT IN (SELECT model FROM ir_model);

-- Исправьте отсутствующие ссылки на поля
DELETE FROM ir_model_fields WHERE name = 'company_id' AND model NOT IN (
    SELECT model FROM ir_model WHERE model IN ('res.users', 'account.move', etc.)
);

Шаг 3: Восстановите данные отсутствующего модуля
Если вы знаете, какой модуль предоставлял поле company_id, вам может потребоваться восстановить его данные:

sql
-- Пример для модуля base (настройте при необходимости)
INSERT INTO ir_model_data (name, model, module, res_id, noupdate)
VALUES ('base_company_id', 'res.users', 'base', 1, true)
ON CONFLICT (module, name) DO NOTHING;

Вариант 2: Свежая база данных с миграцией

Шаг 1: Создайте новую базу данных

bash
createdb new_database_name

Шаг 2: Установите только основные модули
Начните с чистой базы данных и установите только основные модули:

bash
odoo-bin -d new_database_name --without-demo=all --stop-after-init

Шаг 3: Стратегия миграции данных
Как предложено в обсуждении на форуме Odoo:

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

Шаг 4: Экспорт/импорт данных
Используйте встроенные функции экспорта/импорта Odoo или инструменты PostgreSQL для осторожной миграции ваших данных.

Вариант 3: Специфические исправления для модулей

Восстановление поля company_id
Если определение поля company_id отсутствует, вам может потребоваться его воссоздать:

python
# В файле models.py пользовательского модуля
from odoo import fields, models

class ResUsers(models.Model):
    _inherit = 'res.users'
    
    company_id = fields.Many2one('res.company', string='Компания')

Исправление конфигурации XML
Убедитесь, что ваш модуль __manifest__.py включает необходимые файлы безопасности:

python
'data': [
    'security/ir.model.access.csv',
    'security/security.xml',
],

Профилактические меры

Регулярное резервное копирование базы данных

  • Реализуйте автоматическое ежедневное резервное копирование
  • Регулярно тестируйте процедуры восстановления из резервных копий
  • Храните несколько версий резервных копий с разными периодами хранения

Безопасное управление модулями

  • Всегда тестируйте изменения модулей сначала в среде разработки
  • Используйте правильные процедуры обновления вместо ручных операций с базой данных
  • Документируйте все настройки и их зависимости

Мониторинг и оповещения

  • Настройте мониторинг целостности базы данных
  • Мониторьте действия по установке/деинсталляции модулей
  • Реализуйте оповещения для необычного поведения системы

Лучшие практики разработки

  • Как отмечено в обсуждении на Stack Overflow, убедитесь, что все файлы моделей правильно включены в __init__.py
  • Тестируйте зависимости полей перед развертыванием
  • Используйте правильное управление версиями для всех пользовательских модулей

Альтернативные подходы к восстановлению

Использование встроенных инструментов ремонта Odoo

Odoo 13 включает некоторые встроенные механизмы ремонта, которые могут помочь при повреждении базы данных:

Проверка базы данных

bash
odoo-bin -d your_database_name --check-stop-after-init

Обновление модуля с принудительным применением

bash
odoo-bin -d your_database_name --update=all --stop-after-init

Ресурсы поддержки сообщества

  • Форум Odoo: Многие пользователи сообщали о похожих проблемах и находили решения
  • Проблемы на GitHub: Ищите похожие проблемы в репозитории Odoo
  • Stack Overflow: Ищите решения для конкретных шаблонов ошибок

Варианты профессиональной поддержки

Для производственных сред рассмотрите:

  • Поддержка Odoo Enterprise: Официальная поддержка от Odoo S.A.
  • Ассоциация сообщества Odoo: Услуги поддержки на основе сообщества
  • Сторонние консультанты Odoo: Специализированные услуги восстановления

Заключение

Восстановление после ошибки KeyError: ‘company_id’ в Odoo 13 требует систематического устранения неполадок и часто включает ручные вмешательства в базу данных. Ключевые выводы:

  1. Начните с анализа базы данных: Всегда создавайте резервную копию сначала, а затем исследуйте, какие модели и поля отсутствуют или повреждены
  2. Используйте пошаговое восстановление: Начните с ручных исправлений, затем попробуйте переустановку модулей и рассмотрите создание свежей базы данных как последний вариант
  3. Предотвратите будущие проблемы: Реализуйте надежные стратегии резервного копирования и безопасные практики управления модулями

Для производственных сред часто безопаснее создать свежую базу данных и осторожно перенести данные, чем пытаться ремонтировать обширное повреждение. Ресурсы сообщества, доступные через форум Odoo и GitHub, могут предоставить дополнительную информацию, специфичную для вашего конкретного шаблона ошибки.

Источники

  1. Форум Odoo - KeyError при деинсталляции пользовательского модуля в Odoo v8
  2. Stack Overflow - Решение KeyError в Odoo 13
  3. Проблема на GitHub - KeyError Multi-Company
  4. Форум Odoo - Проблема с KeyError: ‘company_id’ (odoo10)
  5. Форум Odoo - Как решить ошибку после восстановления базы данных
  6. Stack Overflow - KeyError при каждом обновлении модуля Odoo
  7. Проблема на GitHub - Восстановление ID2 администратора
  8. Stack Overflow - Поля не существуют в Odoo 12