Trik Optimasi Database Odoo

Saat kita melakukan pengembangan pada sebuah modul di Odoo, ada kalanya kita membuat suatu class, field atau _sql_constraints akan tetapi class, field atau _sql_constraints tersebut tidak jadi digunakan, entah karena kesalahan atau memang tidak sesuai dengan sistem yang sedang dibuat.

Logo Odoo

Class, field atau _sql_constraints yang sudah proses oleh Odoo tentunya akan tetap ada pada database, meskipun tidak digunakan. Hal ini akan membebani database jika kita tidak menghapusnya. Class yang sudah dibuat akan menjadi sebuah tabel, field menjadi sebuah kolom didalam tabel, dan _sql_constraints menjadi sebuah constraint didalam tabel.

Untuk menghapus tabel, kolom dan constraint kita bisa melakukan uninstall pada modul, kemudian install ulang modul tersebut. Hal ini bisa dilakukan dengan catatan belum ada data (record) pada tabel-tabel yang ada pada modul tersebut. Karena jika melakukan uninstall modul, maka data yang ada juga akan dihapus.

Salah satu trik yang bisa digunakan adalah memanggil sebuah fungsi Python dari sebuah view XML, yang didalam fungsi tersebut kita melakukan penghapusan tabel, kolom dan constraint yang sudah tidak digunakan.

Buat sebuah view XML pada sebuah modul.

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
	<data>
		<function id="namamodul_helpers_optimize_db" model="namamodul.helpers.optimize.db" name="do_optimize"/>
	</data>
</odoo>

Tambahkan view tersebut pada manifest.xml.

Buat sebuah TransientModel.

from odoo import models, fields, api

class HelpersOptimizeDB(models.TransientModel):
	_name = 'namamodul.helpers.optimize.db'

	def _drop_column(self, table_name, column_name):
		"""Untuk menghapus kolom di sebuah tabel"""
		sql = """ALTER TABLE %s
			DROP COLUMN IF EXISTS %s""" % (table_name, column_name)
		self._cr.execute(sql)

	def _drop_table(self, table_name):
		"""Untuk menghapus sebuah tabel"""
		sql = """DROP TABLE IF EXISTS %s CASCADE""" % (table_name,)
		self._cr.execute(sql)
		
	def _drop_constraint(self, table_name, constraint_name):
		"""Untuk menghapus constraint pada sebuah tabel"""
		sql = """ALTER TABLE IF EXISTS %s
			DROP CONSTRAINT IF EXISTS %s""" % (table_name, constraint_name)
		self._cr.execute(sql)
		
	def _drop_model(self, model_name):
		"""Gunakan _drop_model daripada _drop_table, untuk menghapus data di ir.model"""
		table_name = model_name.replace('.', '_')
		self._drop_table(table_name)

		sql_model = """SELECT id FROM ir_model WHERE model = '%s'""" % (model_name,)
		self._cr.execute(sql_model)
		fetch = self._cr.fetchone()
		
		if fetch and len(fetch) > 0:
			sql_model_constraint = """DELETE FROM ir_model_constraint WHERE model = %d""" % (fetch[0],)
			self._cr.execute(sql_model_constraint)
			sql_delete = """DELETE FROM ir_model WHERE id = '%d'""" % (fetch[0],)
			self._cr.execute(sql_delete)
		
	@api.model
	def do_optimize(self):
		self._drop_constraint('nama_tabel', 'nama_constraint')
		self._drop_column('nama_tabel', 'nama_kolom')
		self._drop_model('nama_model')

Jangan lupa tambahkan file diatas pada __init__.py

Untuk mengecek apakah tabel masih ada di database, kita bisa menggunakan perintah:

SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'nama_tabel');

Untuk mengecek apakah kolom masih ada di sebuah tabel di database, kita bisa menggunakan perintah:

SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'nama_tabel' AND column_name = 'nama_kolom');

Untuk mengecek apakah constraint masih ada di sebuah tabel di database, kita bisa menggunakan perintah:

SELECT EXISTS (SELECT 1 FROM information_schema.constraint_table_usage WHERE table_name = 'nama_tabel' AND constraint_name = 'nama_constraint');

Jika perintah diatas dijalankan hanya memberikan hasil ‘t’ atau ‘f’. ‘t’ bernilai True berarti tabel, kolom atau constraint masih ada, sebaliknya ‘f’ bernilai False berarti tabel, kolom atau constraint sudah tidak ada.

Selamat mencoba, semoga bermanfaat.

Comments