Skip to content

Commit 37570de

Browse files
chore: Update .gitignore and add support for logger and multiple tables in QuickDB
1 parent 5b1cf04 commit 37570de

File tree

4 files changed

+135
-38
lines changed

4 files changed

+135
-38
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,6 @@ dmypy.json
129129
.pyre/
130130
*.json
131131
test_db.py
132-
test.py
132+
test.py
133+
*.log
134+
quick_db_output/

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format
55
## Version 0.0.2
66

77
- Added support for `schema` and `table` in `Database` class
8+
- Support for logger added
9+
- Support for multiple tables in a database added
10+
- Support for drop table added
11+
- Support for drop database added
12+
- Support for `select` , `insert`, `update` and `delete` queries added
813

914
## [Initial Release]
1015

quickdb/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
from quickdb.main import QuickDB
22

3-
__all__ = ['QuickDB']
3+
__all__ = ["QuickDB"]

quickdb/main.py

+126-36
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,39 @@
11
import os
22
import json
3+
import pandas as pd
4+
import logging
35

46

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):
622
""" 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+
828
self.db_path = db_path
929
self.debug = debug
1030
self.overwrite_db = overwrite_db
1131
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+
1637
def __load_db_from_file(self):
1738
""" Load the database from the file """
1839
with open(self.db_path, 'r') as f:
@@ -22,13 +43,16 @@ def __init_db(self):
2243
"""" Initialize the database """
2344

2445
if not self.overwrite_db and os.path.exists(self.db_path):
46+
self.logger.info(f"Loading database from {self.db_path}")
2547
return self.__load_db_from_file()
2648

2749
if self.overwrite_db and os.path.exists(self.db_path):
50+
self.logger.info(f"Overwriting database from {self.db_path}")
2851
self.clear()
2952
return self.db
3053

31-
return {}
54+
self.logger.info(f"Creating new database at {self.db_path}")
55+
return {"database": {}, "schema": {}}
3256

3357
def dump_db(self):
3458
""" Dump the database to the file """
@@ -38,77 +62,143 @@ def dump_db(self):
3862
return True
3963
except json.JSONDecodeError:
4064
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
4199

42-
def create_table(self, columns_list, primary_key=None):
100+
def create_table(self, table_name, columns_list, primary_key=None):
43101
""" Create the schema of the database """
44-
self.primary_key = primary_key
45-
self.columns_list = columns_list
102+
46103
if primary_key not in columns_list:
47104
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
54112
}
55113

56114
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}")
57117
self.dump_db()
58118

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']
61130

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):
63136
""" 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']
65139

66-
if primary_value in self.db['database'] and not overwrite:
140+
if primary_value in self.db['database'][table_name] and not overwrite:
67141
return False
68142

69-
if len(value) != len(self.columns_list):
143+
if len(value) != len(columns_list):
70144
return False
71145

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}")
73148

74149
if dump_db:
75150
self.dump_db()
76151
return True
77152

78153
def get_db(self):
154+
""" Get the database along with the schema """
79155
return self.db
80156

81157
def clear(self):
158+
""" Clear the database """
82159
self.db = {"database": {}, "schema": {}}
83160
self.dump_db()
161+
self.logger.info("Database cleared")
84162
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):
87175
""" 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]
90178
self.dump_db()
179+
self.logger.info(f"Deleted {primary_value} from {table_name}")
91180
return True
92181
return False
93182

94-
def update(self, primary_value, value):
183+
def update(self, table_name, primary_value, value):
95184
""" 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
98187
self.dump_db()
188+
self.logger.info(f"Updated {primary_value} in {table_name}")
99189
return True
100190
return False
101191

102-
def search(self, primary_value):
192+
def search(self, table_name, primary_value):
103193
""" 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]
106196
return False
107197

108-
def where(self, column_name, value):
198+
def where(self, table_name, column_name, value):
109199
""" Search the key-value pair in the database """
110200
result = []
111-
for key, val in self.db['database'].items():
201+
for key, val in self.db['database'][table_name].items():
112202
if val[column_name] == value:
113203
result.append(val)
114204
return result
@@ -120,4 +210,4 @@ def __str__(self):
120210
return f"QuickDB(db_path={self.db_path}, db={self.db})"
121211

122212
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

Comments
 (0)