生产库字段不存在致模块更新失败,如何通过Termius解决?
Odoo生产环境模块更新失败(字段不存在+Internal Server Error)解决指南
问题背景
在res.users继承模型中新增了布尔字段is_admin_user,本地环境(Terminal/Pycharm)可正常处理字段不存在问题、完成模块更新,但通过Termius操作生产环境时,更新模块后数据库离线,触发Internal Server Error,无法完成字段同步。
关键排查与解决步骤
1. 定位具体错误日志
生产环境的泛错误提示无实际排查价值,必须查看Odoo详细日志:
# 替换为你的Odoo日志实际路径 tail -n 100 /var/log/odoo/odoo.log # 更新模块时实时跟踪日志 tail -f /var/log/odoo/odoo.log
重点关注与is_admin_user字段、res_users表相关的错误,比如数据库权限不足、表锁、字段创建失败等。
2. 手动执行带调试日志的模块升级
通过Termius登录生产服务器,切换到Odoo运行用户后,执行指定模块的升级命令(开启调试日志便于定位问题):
# 切换到Odoo运行用户(示例为odoo) sudo su - odoo # 替换YOUR_DB_NAME为生产库名,YOUR_MODULE_NAME为你的模块名 odoo-bin -d YOUR_DB_NAME --update YOUR_MODULE_NAME --log-level debug
如果遇到数据库锁问题,先清理异常连接:
# 查看PostgreSQL活跃连接 psql -d YOUR_DB_NAME -c "SELECT pid, query FROM pg_stat_activity WHERE state = 'active';" # 杀掉锁表进程(替换PID为对应进程ID) psql -d YOUR_DB_NAME -c "SELECT pg_terminate_backend(PID);"
3. 修复权限问题
- 确保Odoo用户对模块目录有读写权限:
chown -R odoo:odoo /path/to/your/custom/module chmod -R 755 /path/to/your/custom/module
- 确保PostgreSQL用户拥有生产库的完整权限:
psql -d YOUR_DB_NAME -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO odoo;" psql -d YOUR_DB_NAME -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO odoo;"
4. 优化代码避免潜在异常
你的代码存在冗余逻辑,可能在生产环境触发未知问题,优化后:
class ResUserInherit(models.Model): _inherit = 'res.users' user_signature = fields.Binary(string="Signature") user_stamp = fields.Binary(string="Stamp") is_admin_user = fields.Boolean(string='Is Admin', default=False, readonly=False) def signature_domain(self): return [('company_id','=',self.env.company.id)] @api.onchange('company_id') def get_default_admin(self): admin_group = self.env['res.groups'].sudo().search([('name', '=ilike', 'Admin Power')]) self.is_admin_user = self.env.user in admin_group.users
优化点:
- 简化用户组判断逻辑,去掉冗余循环
- 明确声明
readonly=False(避免环境差异导致的默认值异常) - 直接赋值布尔值,去掉不必要的分支判断
5. 升级后重启Odoo服务
模块更新完成后,必须重启服务确保新字段加载生效:
# 适用于systemd管理的Odoo服务 sudo systemctl restart odoo # 验证服务状态 sudo systemctl status odoo
内容的提问来源于stack exchange,提问作者Md Tanvir Islam
相关产品推荐
相关产品推荐

