diff options
| author | Andrew <saintruler@gmail.com> | 2019-07-23 19:31:43 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2019-07-23 19:31:43 +0400 |
| commit | 187723b567a9787f36ec251e00d73536b1825c0d (patch) | |
| tree | 0635f286c8bc156324c4012419c2b79bf9c17a02 /day9/task5_vue/backend/database | |
| parent | 0425296e5bc95ab94556ab09700844b1222dc077 (diff) | |
Добавлен модуль логгера.
Исправлены ошибки в классах типов полей базы данных.
Добавлены файлы для использования Docker.
Diffstat (limited to 'day9/task5_vue/backend/database')
| -rw-r--r-- | day9/task5_vue/backend/database/database.py | 34 | ||||
| -rw-r--r-- | day9/task5_vue/backend/database/field_types.py | 25 | ||||
| -rw-r--r-- | day9/task5_vue/backend/database/wrappers.py | 7 |
3 files changed, 54 insertions, 12 deletions
diff --git a/day9/task5_vue/backend/database/database.py b/day9/task5_vue/backend/database/database.py index 87982cf..44554c7 100644 --- a/day9/task5_vue/backend/database/database.py +++ b/day9/task5_vue/backend/database/database.py @@ -1,27 +1,47 @@ from backend.database.wrappers import Wrapper, MySQLWrapper +from backend.logger import Logger -import logging +from time import sleep def initialize_databases(configs, schemes): + timeout = 5 + max_retries = 7 + for config in configs: if config['type'] == 'mysql': - logger = logging.getLogger('backendDebug') - - logger.debug('Connected') - logger.debug(f'Trying to connect to database "{config["db_name"]}@{config["host"]}"...') + for _ in range(max_retries): + try: + Logger.get_logger().info(f'Trying to connect to database "{config["db_name"]}@{config["host"]}"...') + wrapper = MySQLWrapper(config['host'], config['username'], config['password'], config['db_name']) + Logger.get_logger().info('Connected.') + break + except Exception as e: + Logger.get_logger().info(f'Connection failed. Reason: "{e}";\nTrying again...') + sleep(timeout) + else: + Logger.get_logger().critical( + f'Failed to connect to "{config["db_name"]}@{config["host"]}". ' + f'Check that database and then restart this service.' + ) + continue - wrapper = MySQLWrapper(config['host'], config['username'], config['password'], config['db_name']) wrappers[config['name']] = wrapper cursor = wrapper.connection.cursor() for scheme in schemes: - logger.debug(f'Preparing table "{scheme.meta["name"]}"...') + Logger.get_logger().info(f'Preparing table "{scheme.meta["name"]}"...') cursor.execute('START TRANSACTION; {} COMMIT;'.format(scheme.get_create_line())) wrapper.schemes[scheme.meta['name']] = scheme cursor.close() +def shutdown_databases(): + Logger.get_logger().info('Shutting down databases...') + for wrapper in wrappers: + wrapper.close_connection() + + def get_wrapper_for(database_name) -> Wrapper: return wrappers.get(database_name, None) diff --git a/day9/task5_vue/backend/database/field_types.py b/day9/task5_vue/backend/database/field_types.py index 8713882..9f5bfe8 100644 --- a/day9/task5_vue/backend/database/field_types.py +++ b/day9/task5_vue/backend/database/field_types.py @@ -38,8 +38,11 @@ class TextField(Field): 'NULL' if self.nullable else 'NOT NULL' ] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') return ' '.join(request) @@ -62,8 +65,11 @@ class IntegerField(Field): 'NULL' if self.nullable else 'NOT NULL' ] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') if self.is_auto_increment: request.append('AUTO_INCREMENT') @@ -84,8 +90,11 @@ class DateField(Field): def sql_line(self): request = ['date', 'NULL' if self.nullable else 'NOT NULL'] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') return ' '.join(request) @@ -103,8 +112,11 @@ class TimeField(Field): def sql_line(self): request = ['time', 'NULL' if self.nullable else 'NOT NULL'] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') return ' '.join(request) @@ -122,7 +134,10 @@ class DatetimeField(Field): def sql_line(self): request = ['datetime', 'NULL' if self.nullable else 'NOT NULL'] - if self.default is not None or self.nullable: + if self.default is not None: request.append(f'DEFAULT "{self.default}"') + else: + if self.nullable: + request.append('DEFAULT NULL') return ' '.join(request) diff --git a/day9/task5_vue/backend/database/wrappers.py b/day9/task5_vue/backend/database/wrappers.py index 30d34d9..5bb9761 100644 --- a/day9/task5_vue/backend/database/wrappers.py +++ b/day9/task5_vue/backend/database/wrappers.py @@ -8,6 +8,10 @@ class Wrapper(ABC): self.schemes = {} @abstractmethod + def close_connection(self): + pass + + @abstractmethod def clear_table(self, table_name): pass @@ -46,6 +50,9 @@ class MySQLWrapper(Wrapper): db=db_name ) + def close_connection(self): + self.connection.close() + def clear_table(self, table_name): cursor = self.connection.cursor() cursor.execute(f"START TRANSACTION; DELETE FROM `{table_name}`; COMMIT;") |