Script tersebut tidak akan menghapus semua transient model yang ada, karena hanya menghapus data dari tabel ir_session. Jika Anda ingin menghapus semua transient model, Anda perlu melakukan penghapusan untuk setiap tabel transient model secara eksplisit.
Apa Itu Transient Models di Odoo?
Transient models di Odoo adalah model sementara yang memiliki properti _transient = True. Data di transient models biasanya disimpan di database, tetapi hanya untuk waktu tertentu, setelah itu akan dihapus otomatis oleh Odoo (biasanya dengan cron).
Masalah dengan Script yang Diberikan
- Spesifik pada
ir_session:- Script hanya menghapus data dari tabel
ir_session, yang merupakan salah satu transient model. - Model lain (seperti wizard atau cache) tidak akan terpengaruh.
- Script hanya menghapus data dari tabel
- Tidak Dinamis:
- Jika ada transient model baru, script ini tidak secara otomatis menangani tabel tersebut.
Menghapus Semua Transient Models
Untuk menghapus semua transient model, Anda harus mengidentifikasi semua tabel terkait terlebih dahulu. Berikut adalah langkahnya:
1. Identifikasi Tabel Transient Models
Gunakan query SQL berikut untuk menemukan tabel transient model:
SELECT model
FROM ir_model
WHERE transient = TRUE;
Hasil query ini akan memberikan daftar model transient. Anda kemudian dapat menggunakan nama model untuk menghapus data dari tabel yang sesuai.
2. Contoh Script Python untuk Semua Transient Models
Berikut adalah contoh script untuk menghapus semua transient models berdasarkan batas waktu tertentu:
from datetime import datetime, timedelta
# Hitung batas waktu data yang akan dihapus
expiration_date = datetime.now() - timedelta(days=7)
expiration_date_str = expiration_date.strftime('%Y-%m-%d %H:%M:%S')
# Ambil semua transient models
cr.execute("""
SELECT model
FROM ir_model
WHERE transient = TRUE
""")
models = cr.fetchall()
# Eksekusi delete untuk setiap transient model
for model in models:
table_name = model[0].replace('.', '_') # Konversi nama model ke nama tabel
try:
cr.execute(f"""
DELETE FROM {table_name}
WHERE create_date < %s
""", (expiration_date_str,))
except Exception as e:
# Log atau tangani error jika tabel tidak ada
print(f"Error saat menghapus data dari tabel {table_name}: {e}")
Catatan Penting
- Risiko Penghapusan yang Tidak Tepat:
- Pastikan tabel yang dihapus memang transient dan tidak digunakan secara aktif oleh modul lain.
- Cek Hasil Delete:
- Sebelum menjalankan query DELETE, gunakan SELECT untuk memverifikasi data yang akan dihapus:
cr.execute(f"SELECT COUNT(*) FROM {table_name} WHERE create_date < %s", (expiration_date_str,)) print(f"Data yang akan dihapus dari {table_name}: {cr.fetchone()[0]}")
- Sebelum menjalankan query DELETE, gunakan SELECT untuk memverifikasi data yang akan dihapus:
- Backup Data:
- Selalu lakukan backup sebelum menjalankan operasi penghapusan massal.
Jika ada bagian yang perlu dijelaskan lebih lanjut atau script tambahan, beri tahu saja! 😊
