frday/framework-dss
0
1import sqlite32 3class Database:4 def __init__(self, db_name="dss_framework.db"):5 self.conn = sqlite3.connect(db_name, check_same_thread=False)6 self.cursor = self.conn.cursor()7 self.create_tables()8 9 def create_tables(self):10 # Tabel untuk menyimpan prediksi11 self.cursor.execute("""12 CREATE TABLE IF NOT EXISTS prediksi (13 id INTEGER PRIMARY KEY AUTOINCREMENT,14 nama TEXT,15 metode TEXT16 )17 """)18 19 # Tabel untuk menyimpan kriteria20 self.cursor.execute("""21 CREATE TABLE IF NOT EXISTS kriteria (22 id INTEGER PRIMARY KEY AUTOINCREMENT,23 prediksi_id INTEGER,24 nama TEXT,25 tipe TEXT,26 bobot REAL,27 FOREIGN KEY(prediksi_id) REFERENCES prediksi(id)28 )29 """)30 31 # Tabel untuk menyimpan alternatif32 self.cursor.execute("""33 CREATE TABLE IF NOT EXISTS alternatif (34 id INTEGER PRIMARY KEY AUTOINCREMENT,35 prediksi_id INTEGER,36 nama TEXT,37 FOREIGN KEY(prediksi_id) REFERENCES prediksi(id)38 )39 """)40 41 # Tabel untuk menyimpan nilai alternatif terhadap kriteria42 self.cursor.execute("""43 CREATE TABLE IF NOT EXISTS nilai_alternatif (44 id INTEGER PRIMARY KEY AUTOINCREMENT,45 alternatif_id INTEGER,46 kriteria_id INTEGER,47 nilai REAL,48 FOREIGN KEY(alternatif_id) REFERENCES alternatif(id),49 FOREIGN KEY(kriteria_id) REFERENCES kriteria(id)50 )51 """)52 53 # Tabel untuk menyimpan hasil prediksi54 self.cursor.execute("""55 CREATE TABLE IF NOT EXISTS hasil_prediksi (56 id INTEGER PRIMARY KEY AUTOINCREMENT,57 prediksi_id INTEGER,58 alternatif_id INTEGER,59 skor REAL,60 FOREIGN KEY(prediksi_id) REFERENCES prediksi(id),61 FOREIGN KEY(alternatif_id) REFERENCES alternatif(id)62 )63 """)64 self.conn.commit()65 66 def simpan_prediksi(self, nama_prediksi, metode):67 self.cursor.execute("INSERT INTO prediksi (nama, metode) VALUES (?, ?)", (nama_prediksi, metode))68 self.conn.commit()69 return self.cursor.lastrowid70 71 def simpan_kriteria(self, prediksi_id, nama, tipe, bobot):72 self.cursor.execute("INSERT INTO kriteria (prediksi_id, nama, tipe, bobot) VALUES (?, ?, ?, ?)",73 (prediksi_id, nama, tipe, bobot))74 self.conn.commit()75 return self.cursor.lastrowid76 77 def simpan_alternatif(self, prediksi_id, nama):78 self.cursor.execute("INSERT INTO alternatif (prediksi_id, nama) VALUES (?, ?)", (prediksi_id, nama))79 self.conn.commit()80 return self.cursor.lastrowid81 82 def simpan_nilai_alternatif(self, alternatif_id, kriteria_id, nilai):83 self.cursor.execute("INSERT INTO nilai_alternatif (alternatif_id, kriteria_id, nilai) VALUES (?, ?, ?)",84 (alternatif_id, kriteria_id, nilai))85 self.conn.commit() 86 87 def simpan_hasil(self, prediksi_id, alternatif_id, skor):88 self.cursor.execute("INSERT INTO hasil_prediksi (prediksi_id, alternatif_id, skor) VALUES (?, ?, ?)",89 (prediksi_id, alternatif_id, skor))90 self.conn.commit() 91 92 def ambil_prediksi(self):93 self.cursor.execute("SELECT * FROM prediksi")94 return self.cursor.fetchall()95 96 def ambil_alternatif_id(self, prediksi_id, nama_alternatif):97 self.cursor.execute("SELECT id FROM alternatif WHERE prediksi_id = ? AND nama = ?", (prediksi_id, nama_alternatif))98 result = self.cursor.fetchone()99 return result[0] if result else None100 101 def ambil_prediksi_keyword(self, keyword):102 query = "SELECT * FROM prediksi WHERE nama LIKE ?"103 self.cursor.execute(query, ('%' + keyword + '%',))104 hasil = self.cursor.fetchall()105 return hasil106 107 def ambil_data_tabel(self, tabel, prediksi_id):108 if tabel == "nilai_alternatif":109 query = """110 SELECT 111 a.nama AS nama_alternatif, 112 k.nama AS nama_kriteria, 113 na.nilai114 FROM alternatif a115 JOIN nilai_alternatif na ON a.id = na.alternatif_id116 JOIN kriteria k ON na.kriteria_id = k.id117 WHERE a.prediksi_id = ? 118 ORDER BY a.nama, k.nama119 """120 elif tabel == "hasil_prediksi":121 query = """122 SELECT a.nama AS Alternatif, h.skor AS Skor123 FROM hasil_prediksi h124 JOIN alternatif a ON h.alternatif_id = a.id125 WHERE h.prediksi_id = ?126 ORDER BY h.skor DESC127 """128 else:129 query = f"SELECT * FROM {tabel} WHERE prediksi_id = ?"130 self.cursor.execute(query, (prediksi_id,))131 return self.cursor.fetchall()132 133 def ambil_data_prediksi(self, prediksi_id):134 # Mengambil data prediksi135 query_prediksi = "SELECT * FROM prediksi WHERE id = ?"136 self.cursor.execute(query_prediksi, (prediksi_id,))137 prediksi = self.cursor.fetchone()138 139 # Mengambil data kriteria140 kriteria = self.ambil_data_tabel("kriteria", prediksi_id)141 142 # Mengambil data alternatif143 alternatif = self.ambil_data_tabel("alternatif", prediksi_id)144 145 # Mengambil data nilai alternatif146 nilai_alternatif = self.ambil_data_tabel("nilai_alternatif", prediksi_id)147 148 # Mengorganisir data ke dalam format yang diinginkan149 data_prediksi = {150 'nama_prediksi': prediksi[1],151 'metode': prediksi[2],152 'kriteria': [k[2] for k in kriteria],153 'bobot': [k[4] for k in kriteria],154 'tipe_kriteria': [k[3] for k in kriteria],155 'alternatif': [a[2] for a in alternatif],156 'matrix': [[n[2] for n in nilai_alternatif if n[0] == a[0]] for a in alternatif]157 }158 159 return data_prediksi