py.lib
44:bfc3a109c06c
Go to Latest
py.lib/db/migrator.py
. Убираем лишние форматированные строки
* Проблема с созданием вложенных журналов в сложных ситуациях с локами и ротируемым журналом.
3 Инструмент миграции схемы БД.
5 DOC: https://ws.a0fs.net/w/ncc.ws/devel/python/modules/db_migrator/
8 from os.path import exists, join as p_join, isdir
12 class MigrateError(Exception):
16 class MigrateManager(object):
17 def __init__(self, control_table: str, migrate_env: str):
18 self.control_table = control_table
20 if not exists(migrate_env):
21 raise MigrateError('Migrate enviroment not found')
23 self.schema = p_join(migrate_env, 'schema.sql')
24 if not exists(self.schema):
25 raise MigrateError(f'Schema file not found: {self.schema}')
27 self.patch_dir = p_join(migrate_env, 'patch')
28 if not isdir(self.patch_dir):
29 raise MigrateError(f'Patch dir not found or not directory: {self.patch_dir}')
31 def get_patch_files(self, ver: int):
33 for f in listdir(self.patch_dir):
34 if not f.lower().endswith('.sql'):
37 _f = f.strip().split('.')
42 except (TypeError, ValueError) as e:
43 raise MigrateError(f'Error on parse version "{_f[0]}" of file "{f}": {e}')
46 raise MigrateError(f'Error on get version from filename: {f}')
49 raise MigrateError(f'Version duplicates on parse file: {f}')
51 res[_ver] = p_join(self.patch_dir, f)
53 for i in sorted(res.keys()):
58 def get_commands(file):
60 with open(file) as IN:
62 if l.lstrip().startswith('--'):
73 def init_db(self, db):
75 for c in self.get_commands(self.schema):
83 cursor.execute(f"SELECT version FROM {self.control_table}")
94 for up_ver, patch_file in self.get_patch_files(ver):
96 for cmd in self.get_commands(patch_file):
100 cursor.execute(f"DELETE FROM {self.control_table}")
103 INSERT INTO {self.control_table} (version)
109 def get_conn_from_my_obj(obj: object):
111 Получиение объекта соединения из обёрток, которые я сам себе пишу для работы с DB-API
116 if hasattr(obj, '_conn'):
118 elif hasattr(obj, '_con'):
121 raise TypeError('No known connection object in given database object found')