Повреждение базы данных 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'
Вопросы:
- Что могло привести к неожиданной деинсталляции основных модулей в Odoo 13?
- Как правильно восстановиться от ошибки “KeyError: ‘company_id’” при попытке переустановки модулей?
- Какие шаги следует предпринять для восстановления базы данных в рабочее состояние?
Буду благодарен за любые идеи и рекомендации.
Ошибка 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 и проверьте целостность модели
sudo su - postgres
psql your_database_name
2. Проверьте записи ir_model
Проверьте, существует ли модель, содержащая company_id, в базе данных:
SELECT * FROM ir_model WHERE model = 'res.users';
SELECT * FROM ir_model WHERE model = 'account.move';
3. Ручная очистка осиротевших ссылок
Если модели отсутствуют, но ссылки остаются, вам потребуется их очистить. Согласно решению на форуме Odoo:
“Просто найдите эти идентификаторы и удалите их, и ошибка KeyError исчезнет.”
4. Проверьте отсутствие определений полей
-- Проверьте, существует ли поле company_id в модели
SELECT * FROM ir_model_fields WHERE name = 'company_id' AND model = 'res.users';
Стратегия переустановки модулей
1. Определите затронутые модули
На основе трассировки ошибки и ваших знаний о том, что было деинсталлировано, определите, какие основные модули затронуты.
2. Процесс безопасной переустановки
- Сначала попробуйте переустановить только модуль
baseс помощью веб-интерфейса Odoo или командной строки - Если это не сработает, переходите к ручным исправлениям в базе данных
3. Используйте оболочку Odoo для экстренных исправлений
Как показано в решении на Stack Overflow:
sudo python3 /opt/odoo/odoo-bin shell -d your_database_name
Внутри оболочки вы можете вручную проверить и исправить ссылки на поля.
Методы восстановления базы данных
Вариант 1: Ручной ремонт базы данных
Шаг 1: Создайте резервную копию текущей базы данных
pg_dump your_database_name > backup_$(date +%Y%m%d_%H%M%S).sql
Шаг 2: Очистите проблемные ссылки
-- Удалите осиротевшие ссылки на модели
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, вам может потребоваться восстановить его данные:
-- Пример для модуля 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: Создайте новую базу данных
createdb new_database_name
Шаг 2: Установите только основные модули
Начните с чистой базы данных и установите только основные модули:
odoo-bin -d new_database_name --without-demo=all --stop-after-init
Шаг 3: Стратегия миграции данных
Как предложено в обсуждении на форуме Odoo:
“поместите все ранее использованные модули в список модулей фиктивной базы данных, но также установите их в фиктивной базе данных, прежде чем они смогут выполнить свою работу для восстановленной базы данных.”
Шаг 4: Экспорт/импорт данных
Используйте встроенные функции экспорта/импорта Odoo или инструменты PostgreSQL для осторожной миграции ваших данных.
Вариант 3: Специфические исправления для модулей
Восстановление поля company_id
Если определение поля company_id отсутствует, вам может потребоваться его воссоздать:
# В файле models.py пользовательского модуля
from odoo import fields, models
class ResUsers(models.Model):
_inherit = 'res.users'
company_id = fields.Many2one('res.company', string='Компания')
Исправление конфигурации XML
Убедитесь, что ваш модуль __manifest__.py включает необходимые файлы безопасности:
'data': [
'security/ir.model.access.csv',
'security/security.xml',
],
Профилактические меры
Регулярное резервное копирование базы данных
- Реализуйте автоматическое ежедневное резервное копирование
- Регулярно тестируйте процедуры восстановления из резервных копий
- Храните несколько версий резервных копий с разными периодами хранения
Безопасное управление модулями
- Всегда тестируйте изменения модулей сначала в среде разработки
- Используйте правильные процедуры обновления вместо ручных операций с базой данных
- Документируйте все настройки и их зависимости
Мониторинг и оповещения
- Настройте мониторинг целостности базы данных
- Мониторьте действия по установке/деинсталляции модулей
- Реализуйте оповещения для необычного поведения системы
Лучшие практики разработки
- Как отмечено в обсуждении на Stack Overflow, убедитесь, что все файлы моделей правильно включены в
__init__.py - Тестируйте зависимости полей перед развертыванием
- Используйте правильное управление версиями для всех пользовательских модулей
Альтернативные подходы к восстановлению
Использование встроенных инструментов ремонта Odoo
Odoo 13 включает некоторые встроенные механизмы ремонта, которые могут помочь при повреждении базы данных:
Проверка базы данных
odoo-bin -d your_database_name --check-stop-after-init
Обновление модуля с принудительным применением
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 требует систематического устранения неполадок и часто включает ручные вмешательства в базу данных. Ключевые выводы:
- Начните с анализа базы данных: Всегда создавайте резервную копию сначала, а затем исследуйте, какие модели и поля отсутствуют или повреждены
- Используйте пошаговое восстановление: Начните с ручных исправлений, затем попробуйте переустановку модулей и рассмотрите создание свежей базы данных как последний вариант
- Предотвратите будущие проблемы: Реализуйте надежные стратегии резервного копирования и безопасные практики управления модулями
Для производственных сред часто безопаснее создать свежую базу данных и осторожно перенести данные, чем пытаться ремонтировать обширное повреждение. Ресурсы сообщества, доступные через форум Odoo и GitHub, могут предоставить дополнительную информацию, специфичную для вашего конкретного шаблона ошибки.
Источники
- Форум Odoo - KeyError при деинсталляции пользовательского модуля в Odoo v8
- Stack Overflow - Решение KeyError в Odoo 13
- Проблема на GitHub - KeyError Multi-Company
- Форум Odoo - Проблема с KeyError: ‘company_id’ (odoo10)
- Форум Odoo - Как решить ошибку после восстановления базы данных
- Stack Overflow - KeyError при каждом обновлении модуля Odoo
- Проблема на GitHub - Восстановление ID2 администратора
- Stack Overflow - Поля не существуют в Odoo 12