Mengatasi Error Column Does Not Exist pada Odoo

Sebagai programmer odoo, di tengah-tengah proses pengembangan sebuah module atau addon, pernahkah anda mengalami hal tidak mengenakkan seperti setelah anda merefresh browser, tiba-tiba muncul pesan Internal Server Error seperti dibawah ini ?

Setelah kita cek di terminal atau file log, ternyata muncul pesan ProgrammingError: column res_partner.max_order_item does not exist seperti pada gambar dibawah ini.

Dari gambar diatas, terlihat bahwa kata odoo, column atau field max_order_item tidak ada. Hmmm, apakah benar-benar tidak ada ? Ada kok, berikut ini adalah screenshot source code milik saya, yang jelas-jelas ada field dengan nama max_order_item.

Tetapi kenapa odoo masih menganggap bawah field itu tidak ada ? Aneh.

Jujur, sewaktu saya memulai karir sebagai programmer odoo, error ini saya anggap sebagai error yang paling menyebalkan. Karena error ini tidak selalu terjadi, sehingga sulit untuk mengetahui penyebabnya. Misal di komputer saya tidak error, tetapi ketika dicoba di komputer tester muncul error. Atau di komputer saya dan komputer tester tidak error, tetapi saat diupload ke server client muncul error.

Dulu, saya harus menghabiskan waktu berhari-hari untuk menyelidiki error ini dan mencari tahu cara bagaimana menyelesaikannya. Yang alhamdulilah akhirnya berbuah manis 🙂

Ternyata error ini hanya terjadi jika kita menambah field pada suatu model tertentu – setahu saya hanya terjadi pada model res.users dan model res.partner – sedangkan module atau addon dimana kita menambah field tersebut sudah ter-install, kemudian kita me-restart service odoo dan me-refresh browser.

Sebagai contoh kasus, misal kita membuat module atau addon baru dengan nama tutorial_field_not_found dengan sebuah model yang inherit ke model res.partner seperti dibawah ini.

# -*- coding: utf-8 -*-

from odoo import api, fields, models, _

class Partner(models.Model):
    _inherit = 'res.partner'

    sales_limit = fields.Float(string='Sales Amount Limit')

Karena module tutorial_field_not_found adalah module baru, tentu kita harus me-restart service odoo dan meng-installnya. Tidak ada masalah sampai sini.

Kemudian tambahkan sebuah field baru seperti pada kode dibawah ini.

# -*- coding: utf-8 -*-

from odoo import api, fields, models, _

class Partner(models.Model):
    _inherit = 'res.partner'

    sales_limit = fields.Float(string='Sales Amount Limit')
    # field max_order_item ini ditambahkan setelah module terinstall
    max_order_item = fields.Float(string='Maximum Item in One Order')

Restart service odoo, kemudian refresh browser anda. Dapat dipastikan pesan Internal Server Error seperti pada gambar pertama diatas akan muncul.

Jika sebelum menambahkan field baru – dalam contoh kasus ini adalah field max_order_item – kita sudah meng-uninstall module tutorial_field_not_found, kemudian setelah field ditambahkan kita meng-install kembali module tersebut, error ini tidak akan muncul. Tetapi cara ini tentu tidak bisa dilakukan di database production, karena data-data yang sudah ada sebelumnya akan hilang.

Aksi paling aman yang bisa kita lakukan adalah dengan cara mengubah state dari model ir.module.module menjadi uninstalled dengan perintah SQL, bisa lewat terminal atau lewat aplikasi PGAdmin, di database yang error. Berikut ini adalah caranya.

-- ubah status module tutorial_field_not_found jadi uninstalled
-- agar tidak dibaca saat service odoo direstart, sehingga tidak error
update ir_module_module set state = 'uninstalled' where name = 'tutorial_field_not_found';

Setelah state dari module tutorial_field_not_found menjadi uninstalled, restart service odoo, refresh browser, kemudian masuk menu Apps dan cari module tersebut.

Dari gambar di atas, terlihat bahwa module tutorial_field_not_found tidak terinstall. Tidak apa-apa. Klik tombol Install untuk menginstall module tersebut kembali.

Dengan cara ini kita bisa menyelesaikan error column does not exist dengan cara yang lebih aman. Memang sedikit ribet, tapi untungnya tidak semua model akan mengakibatkan error ini jika kita menambah field baru pada model tersebut, sejauh yang saya tahu error ini hanya terjadi pada model res.users dan model res.partner saja.

Saya mendapat beberapa feedback dari beberapa pengguna twitter saat saya memposting tulisan ini di situs tersebut, yang pertama adalah, untuk mengatasi error ini, kita bisa mengupgrade module lewat command line, tidak perlu mengubah state model ir.module.module. Caranya silakan baca di forum odoo ini. Sudah saya tes, cara ini berhasil. Terima kasih @prdgmdgtl dan @oasis_agano atas masukkannya.

Feedback yang kedua adalah kondisi lain yang dapat menyebabkan error ini, tetapi sayang saya masih belum mengalaminya.

Tulisan Serupa

Leave a Reply