1- import os
21
32import psycopg2
4- from config import Config
5- from .sql_queries import SQL
6-
7-
8- DATABASE_URL = Config .POSTGREST_DATABASE_URI
9- DB_NAME = Config .DB_NAME
10-
113
124class DatabaseConnection :
135 """Class to manage database connection"""
@@ -28,136 +20,3 @@ def __init__(self, url=None):
2820 print ("Cannot connect to database" , e )
2921 else : #pragma: no cover
3022 print ('Could not connect to database\n Reason: Database url not provided!' )
31-
32- class DbMethods :
33- """Class with database actions"""
34-
35- def create_Users_table (self ):
36- DbManager .excute_sql (SQL ['create_users_table' ], tablename = 'users' )
37-
38- def create_Questions_table (self ):
39- DbManager .excute_sql (SQL ['create_questions_table' ], tablename = 'questions' )
40-
41- def create_Answers_table (self ):
42- DbManager .excute_sql (SQL ['create_answers_table' ], tablename = 'answers' )
43-
44- def insert_new_record (self , tablename , data ):
45- if tablename == 'users' :
46- DbManager .excute_sql (
47- SQL ['insert_into_users' ],
48- tablename = 'users' ,
49- values = (
50- data ['username' ],
51- data ['email' ],
52- data ['password' ],
53- data ['user_id' ],
54- ))
55-
56- elif tablename == 'questions' :
57- DbManager .excute_sql (
58- SQL ['insert_into_questions' ],
59- tablename = 'questions' ,
60- values = (
61- data ['topic' ],
62- data ['body' ],
63- data ['author' ],
64- data ['questionId' ]
65- ))
66-
67- elif tablename == 'answers' :
68- DbManager .excute_sql (
69- SQL ['insert_into_answers' ],
70- tablename = 'answers' ,
71- values = (
72- data ['Qn_Id' ],
73- data ['body' ],
74- data ['answerId' ],
75- data ['author' ],
76- data ['prefered' ]
77- ))
78-
79- def query_all (self , tablename ):
80- return DbManager .get (SQL ['select' ], tablename = tablename )
81-
82-
83- def get_user (self , username ):
84- return DbManager .get (SQL ['fetch_user' ], value = username )
85-
86- def get_question (self , question_id ):
87- return DbManager .get (SQL ['get_question' ], value = question_id )
88-
89- def update_question (self , new_topic , new_body , questionId ):
90- DbManager .excute_sql (SQL ['update_question' ], values = (new_topic , new_body , questionId ))
91-
92- def update_answer (self , answerId ):
93- DbManager .excute_sql (SQL ['update_question' ], values = (True , str (answerId )))
94-
95- def delete_entry (self , tablename , id_value ):
96- if tablename == 'questions' :
97- DbManager .excute_sql (SQL ['delete_question' ], values = (id_value , ))
98- elif tablename == 'answers' :
99- DbManager .excute_sql (SQL ['delete_answer' ], values = (id_value , ))
100- elif tablename == 'users' :
101- DbManager .excute_sql (SQL ['delete_user' ], values = (id_value , ))
102-
103- def drop_table (self , tablename ):
104- DbManager .excute_sql (SQL ['drop' ].format (tablename ), drop = True )
105-
106- def create_all (self ):
107- self .create_Answers_table ()
108- self .create_Users_table ()
109- self .create_Questions_table ()
110-
111- def drop_all (self ):
112- for table in self .tablenames :
113- self .drop_table (table )
114-
115- class DbManager (DatabaseConnection , DbMethods ):
116- """Class ro manage database actions"""
117-
118- def __init__ (self , env , local = None ):
119- super (DbManager , self ).__init__ (
120- url = DbManager .create_db_url (env , local = local )
121- )
122- self .tablenames = ['users' , 'questions' , 'answers' ]
123-
124- @classmethod
125- def create_db_url (cls , env , local = None ):
126- test_db = Config .TEST_DB
127- db_name = Config .DB_NAME
128- if env in ['testing' , 'development' ]:
129- return f"postgresql://localhost/{ db_name } " if local \
130- else f"postgresql://localhost/{ test_db } "
131- return Config .POSTGREST_DATABASE_URI
132-
133-
134- @classmethod
135- def excute_sql (cls , sql , tablename = None , values = None , drop = None ):
136- try :
137- if tablename and drop is None :
138- cls .instance .tablename = tablename
139- cls .instance .cursor .execute (sql , values ) if values else cls .instance .cursor .execute (sql )
140- except (Exception , psycopg2 .DatabaseError ) as error : #pragma: no cover
141- print (error )
142-
143- @classmethod
144- def get (cls , sql , tablename = None , value = None ):
145- try :
146- if tablename :
147- cls .instance .cursor .execute (sql .format (tablename ))
148- results = cls .instance .cursor .fetchall ()
149- return list (results )
150- elif value :
151- cls .instance .cursor .execute (sql , (value ,))
152- result = cls .instance .cursor .fetchone ()
153- return result if result else None
154-
155- except (Exception , psycopg2 .DatabaseError ) as error : #pragma: no cover
156- print (error )
157-
158-
159-
160- conn = DbManager (os .getenv ('APP_SETTINGS' ), local = True )
161-
162- conn .create_all ()
163- # conn.drop_all
0 commit comments