Menghapus semua transient model Odoo 10

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

  1. 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.
  2. 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

  1. Risiko Penghapusan yang Tidak Tepat:
    • Pastikan tabel yang dihapus memang transient dan tidak digunakan secara aktif oleh modul lain.
  2. 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]}")
  3. Backup Data:
    • Selalu lakukan backup sebelum menjalankan operasi penghapusan massal.

Jika ada bagian yang perlu dijelaskan lebih lanjut atau script tambahan, beri tahu saja! 😊

Leave a comment