diff --git a/ArtNet/db/db_adapter.py b/ArtNet/db/db_adapter.py index 223635e..462cb51 100644 --- a/ArtNet/db/db_adapter.py +++ b/ArtNet/db/db_adapter.py @@ -5,6 +5,9 @@ from psycopg2.errorcodes import UNIQUE_VIOLATION class DBAdapter: + EXPECTED_TABLES = ['art', 'artist', 'tag', 'topic', 'presence', 'artist_topic', 'art_author', + 'art_tag', 'tag_alias', 'tag_implication', 'tag_category'] + def __init__(self, user: str, password: str, host: str = "localhost", port: int = 5432, database: str = "artnet"): self.db = None self.db_cursor = None @@ -16,6 +19,34 @@ class DBAdapter: raise ValueError("Invalid DB credentials!") print("DB connection to {0}:{1}/{2}".format(host, port, database)) + if not self.check_tables(): + raise ValueError("Invalid DB schema") + + def check_tables(self) -> bool: + """ + Check if all the expected tables are present in the connected database. + :return: + """ + self.db_cursor.execute("select relname from pg_class where relkind='r' and relname !~ '^(pg_|sql_)';") + present_tables = self.db_cursor.fetchall() + unknown_tables = [] + missing = [x for x in DBAdapter.EXPECTED_TABLES] + for table in present_tables: + table = table[0] + if table not in DBAdapter.EXPECTED_TABLES: + unknown_tables.append(table) + else: + missing.remove(table) + + if len(missing) > 0: + print("The following tables are missing from the currently connected database: {0}".format(missing)) + return False + + if len(unknown_tables) > 0: + print("The following tables are unknown and not expected inside the database: {0}".format(unknown_tables)) + + return True + def save_image(self, ID: str, title: str, authors: list, path: str, tags: list, link: str, md5_hash: str): """ Updates or saves the given image data to the DB