1
1
import os
2
2
import json
3
+ import pandas as pd
4
+ import logging
3
5
4
6
5
- class QuickDB :
7
+ class Logger :
8
+ """ Logger class to log the messages """
9
+ def __init__ (self , log_path ):
10
+ self .log_path = log_path
11
+ self .logger = logging .getLogger (__name__ )
12
+
13
+ logging .basicConfig (filename = self .log_path ,
14
+ level = logging .INFO ,
15
+ format = '%(asctime)s:%(levelname)s:%(lineno)d:%(message)s' ,
16
+ datefmt = '%Y-%m-%d %H:%M:%S' ,
17
+ filemode = 'a' )
18
+ self .logger .info (f"Logger initialized with log path { self .log_path } " )
19
+
20
+
21
+ class QuickDB (Logger ):
6
22
""" python database.py """
7
- def __init__ (self , db_path = "db.json" , overwrite_db = False , debug = True ):
23
+ def __init__ (self , db_path = "db.json" , db_drop_path = "quick_db_output" ,
24
+ overwrite_db = False , debug = True , db_log_path = "dedug.log" ):
25
+ super ().__init__ (db_log_path )
26
+ """ Initialize the database """
27
+
8
28
self .db_path = db_path
9
29
self .debug = debug
10
30
self .overwrite_db = overwrite_db
11
31
self .db = self .__init_db ()
12
- self .primary_key = None
13
- self .primary_value_index = None
14
- self .primary_value = None
15
-
32
+ self .schema = self .db ['schema' ]
33
+ self .database = self .db ['database' ]
34
+ self .db_drop_path = db_drop_path
35
+ self .db_log_path = db_log_path
36
+
16
37
def __load_db_from_file (self ):
17
38
""" Load the database from the file """
18
39
with open (self .db_path , 'r' ) as f :
@@ -22,13 +43,16 @@ def __init_db(self):
22
43
"""" Initialize the database """
23
44
24
45
if not self .overwrite_db and os .path .exists (self .db_path ):
46
+ self .logger .info (f"Loading database from { self .db_path } " )
25
47
return self .__load_db_from_file ()
26
48
27
49
if self .overwrite_db and os .path .exists (self .db_path ):
50
+ self .logger .info (f"Overwriting database from { self .db_path } " )
28
51
self .clear ()
29
52
return self .db
30
53
31
- return {}
54
+ self .logger .info (f"Creating new database at { self .db_path } " )
55
+ return {"database" : {}, "schema" : {}}
32
56
33
57
def dump_db (self ):
34
58
""" Dump the database to the file """
@@ -38,77 +62,143 @@ def dump_db(self):
38
62
return True
39
63
except json .JSONDecodeError :
40
64
return False
65
+
66
+ def dumb_table (self , table_name , output_format = 'json' ):
67
+ """ Dump the table to the file """
68
+ if table_name not in self .db ['database' ]:
69
+ return False
70
+
71
+ os .makedirs (self .db_drop_path , exist_ok = True )
72
+
73
+ table_data = self .db ['database' ][table_name ]
74
+
75
+ if output_format == 'json' :
76
+ with open (os .path .join (self .db_drop_path , f"{ table_name } .json" ), 'w+' ) as f :
77
+ json .dump (table_data , f , indent = 4 )
78
+ self .logger .info (f"Table { table_name } dumped to { table_name } .json" )
79
+ return True
80
+
81
+ if output_format == 'csv' :
82
+ df = pd .DataFrame (table_data ).T
83
+ df .to_csv (os .path .join (self .db_drop_path , f"{ table_name } .csv" ), index = False )
84
+ self .logger .info (f"Table { table_name } dumped to { table_name } .csv" )
85
+ return True
86
+
87
+ if output_format == 'excel' :
88
+ df = pd .DataFrame (table_data )
89
+ df .to_excel (os .path .join (self .db_drop_path , f"{ table_name } .xlsx" ), index = False )
90
+ self .logger .info (f"Table { table_name } dumped to { table_name } .xlsx" )
91
+ return True
92
+
93
+ if output_format == 'df' :
94
+ return pd .DataFrame (table_data )
95
+
96
+ if output_format == 'print' :
97
+ print (table_data )
98
+ return True
41
99
42
- def create_table (self , columns_list , primary_key = None ):
100
+ def create_table (self , table_name , columns_list , primary_key = None ):
43
101
""" Create the schema of the database """
44
- self .primary_key = primary_key
45
- self .columns_list = columns_list
102
+
46
103
if primary_key not in columns_list :
47
104
raise ValueError (f"Primary key { primary_key } not in columns list" )
48
- self .primary_value_index = self .columns_list .index (self .primary_key )
49
-
50
- self .schema = {
51
- "columns_list" : self .columns_list ,
52
- "primary_key" : self .primary_key ,
53
- "primary_value_index" : self .primary_value_index
105
+
106
+ primary_key_index = columns_list .index (primary_key )
107
+
108
+ self .schema [table_name ] = {
109
+ "columns_list" : columns_list ,
110
+ "primary_key" : primary_key ,
111
+ "primary_key_index" : primary_key_index
54
112
}
55
113
56
114
self .db ['schema' ] = self .schema
115
+ self .db ['database' ][table_name ] = {}
116
+ self .logger .info (f"Table { table_name } created with columns { columns_list } and primary key { primary_key } " )
57
117
self .dump_db ()
58
118
59
- def get_table (self ):
60
- return self .db ['schema' ]
119
+ def get_table_names (self ):
120
+ """ Get all the tables in the database"""
121
+ return list (self .schema .keys ())
122
+
123
+ def get_table (self , table_name ):
124
+ """ Get the table schema """
125
+ return self .schema [table_name ]
126
+
127
+ def get_table_columns (self , table_name ):
128
+ """ Get the columns of the table """
129
+ return self .schema [table_name ]['columns_list' ]
61
130
62
- def insert (self , value , overwrite = False , dump_db = False ):
131
+ def get_table_primary_key (self , table_name ):
132
+ """ Get the primary key of the table """
133
+ return self .schema [table_name ]['primary_key' ]
134
+
135
+ def insert_into (self , table_name , value , overwrite = False , dump_db = False ):
63
136
""" Set the key-value pair in the database """
64
- primary_value = str (value [self .primary_value_index ])
137
+ primary_value = value [self .schema [table_name ]['primary_key_index' ]]
138
+ columns_list = self .schema [table_name ]['columns_list' ]
65
139
66
- if primary_value in self .db ['database' ] and not overwrite :
140
+ if primary_value in self .db ['database' ][ table_name ] and not overwrite :
67
141
return False
68
142
69
- if len (value ) != len (self . columns_list ):
143
+ if len (value ) != len (columns_list ):
70
144
return False
71
145
72
- self .db ["database" ][primary_value ] = dict (zip (self .columns_list , value ))
146
+ self .db ["database" ][table_name ][primary_value ] = dict (zip (columns_list , value ))
147
+ self .logger .info (f"Inserted { value } into { table_name } " )
73
148
74
149
if dump_db :
75
150
self .dump_db ()
76
151
return True
77
152
78
153
def get_db (self ):
154
+ """ Get the database along with the schema """
79
155
return self .db
80
156
81
157
def clear (self ):
158
+ """ Clear the database """
82
159
self .db = {"database" : {}, "schema" : {}}
83
160
self .dump_db ()
161
+ self .logger .info ("Database cleared" )
84
162
return True
85
-
86
- def delete (self , primary_value ):
163
+
164
+ def drop_table (self , table_name ):
165
+ """ Drop the table from the database """
166
+ if table_name in self .db ['database' ]:
167
+ del self .db ['database' ][table_name ]
168
+ del self .db ['schema' ][table_name ]
169
+ self .dump_db ()
170
+ self .logger .info (f"Table { table_name } dropped" )
171
+ return True
172
+ return False
173
+
174
+ def delete (self , table_name , primary_value ):
87
175
""" Delete the key-value pair in the database """
88
- if primary_value in self .db ['database' ]:
89
- del self .db ['database' ][primary_value ]
176
+ if primary_value in self .db ['database' ][ table_name ] :
177
+ del self .db ['database' ][table_name ][ primary_value ]
90
178
self .dump_db ()
179
+ self .logger .info (f"Deleted { primary_value } from { table_name } " )
91
180
return True
92
181
return False
93
182
94
- def update (self , primary_value , value ):
183
+ def update (self , table_name , primary_value , value ):
95
184
""" Update the key-value pair in the database """
96
- if primary_value in self .db ['database' ]:
97
- self .db ['database' ][primary_value ] = value
185
+ if primary_value in self .db ['database' ][ table_name ] :
186
+ self .db ['database' ][table_name ][ primary_value ] = value
98
187
self .dump_db ()
188
+ self .logger .info (f"Updated { primary_value } in { table_name } " )
99
189
return True
100
190
return False
101
191
102
- def search (self , primary_value ):
192
+ def search (self , table_name , primary_value ):
103
193
""" Search the key-value pair in the database """
104
- if primary_value in self .db ['database' ]:
105
- return self .db ['database' ][primary_value ]
194
+ if primary_value in self .db ['database' ][ table_name ] :
195
+ return self .db ['database' ][table_name ][ primary_value ]
106
196
return False
107
197
108
- def where (self , column_name , value ):
198
+ def where (self , table_name , column_name , value ):
109
199
""" Search the key-value pair in the database """
110
200
result = []
111
- for key , val in self .db ['database' ].items ():
201
+ for key , val in self .db ['database' ][ table_name ] .items ():
112
202
if val [column_name ] == value :
113
203
result .append (val )
114
204
return result
@@ -120,4 +210,4 @@ def __str__(self):
120
210
return f"QuickDB(db_path={ self .db_path } , db={ self .db } )"
121
211
122
212
def __getitem__ (self , key ):
123
- return self .db ["database" ][key ] if key in self .db ["database" ] else None
213
+ return self .db ["database" ][key ] if key in self .db ["database" ] else None
0 commit comments