LINUX.ORG.RU

История изменений

Исправление ei-grad, (текущая версия) :

Просто с большой вероятностью твое dbdata это MetaData.tables, можно не плодить сущности, все нужные методы у тебя уже есть. Если ты не собираешься использовать ORM да ещё с разными реализациями - то дополнительная прослойка не нужна.

общий метод инициализации для всех скриптов, который бы устанавливал то, как скрипт должен работать с БД

Суть в том, чтобы явно перенести логику подготовки БД в отдельный кусок кода, например, класс типа такого:

class CommandManager:

    def __init__(self):
        self.tables = set()
        self.scripts = []

    def register_script(self, tables_for_script, script):
        self.scripts.append(script)
        self.tables.add(tables_for_script)

    def run(self):
        for table in self.tables:
            self.load_metadata(table)
        for script in self.scripts:
            self.run_script(script)

В методе run_script - реализовать запуск скриптов с передачей им необходимых параметров.

Метод register_script вызывать, и создавать сам CommandManager, можно по-разному. Например сделать синглтон (просто глобальную переменную в модуле, модули в Python - сами по себе синглтоны) и обернуть все скрипты декораторами с указанием списков таблиц. Или в какой-нибудь функции main явно вызвать register_script по определенному там же списку скриптов.

Но, повторюсь, это может быть оверкилл, и всё что тебе не хватало, вероятно, это:

from . import db
if 'table1' not in db.metadata.tables:
    db.load_table('table1')

С оглядкой на многопоточность можно обернуть load_table блокировками по ключу. И if тоже можно перенести внутрь load_table.

Исправление ei-grad, :

Просто с большой вероятностью твое dbdata это MetaData.tables, можно не плодить сущности, все нужные методы у тебя уже есть. Если ты не собираешься использовать ORM да ещё с разными реализациями - то дополнительная прослойка не нужна.

общий метод инициализации для всех скриптов, который бы устанавливал то, как скрипт должен работать с БД

Суть в том, чтобы явно перенести логику подготовки БД в отдельный кусок кода, например, класс типа такого:

class CommandManager:

    def __init__(self):
        self.tables = set()
        self.scripts = []

    def register_script(self, tables_for_script, script):
        self.scripts.append(script)
        self.tables.add(tables_for_script)

    def run(self):
        for table in self.tables:
            self.load_metadata(table)
        for script in self.scripts:
            self.run_script(script)

В методе run_script - реализовать запуск скриптов с передачей им необходимых параметров.

Метод register_script вызывать, и создавать сам CommandManager, можно по-разному. Например сделать синглтон (просто глобальную переменную в модуле, модули в Python - сами по себе синглтоны) и обернуть все скрипты декораторами с указанием списков таблиц. Или в какой-нибудь функции main явно вызвать register_script по определенному там же списку скриптов.

Но, повторюсь, это может быть оверкилл, и всё что тебе не хватало, вероятно, это:

from . import db
if 'table1' not in db.metadata.tables:
    db.load_table('table1')

С оглядкой на многопоточность можно обернуть load_table блокировками по ключу.

Исправление ei-grad, :

Просто с большой вероятностью твое dbdata это MetaData.tables, можно не плодить сущности, все нужные методы у тебя уже есть. Если ты не собираешься использовать ORM да ещё с разными реализациями - то дополнительная прослойка не нужна.

общий метод инициализации для всех скриптов, который бы устанавливал то, как скрипт должен работать с БД

Суть в том, чтобы явно перенести логику подготовки БД в отдельный кусок кода, например, класс типа такого:

class CommandManager:

    def __init__(self):
        self.tables = set()
        self.scripts = []

    def register_script(self, tables_for_script, script):
        self.scripts.append(script)
        self.tables.add(tables_for_script)

    def run(self):
        for table in self.tables:
            self.load_metadata(table)
        for script in self.scripts:
            self.run_script(script)

В методе run_script - реализовать запуск скриптов с передачей им необходимых параметров.

Метод register_script вызывать, и создавать сам CommandManager, можно по-разному. Например сделать синглтон (просто глобальную переменную в модуле, модули в Python - сами по себе синглтоны) и обернуть все скрипты декораторами с указанием списков таблиц. Или в какой-нибудь функции main явно вызвать register_script по определенному там же списку скриптов.

Но, повторюсь, это может быть оверкилл, и всё что тебе не хватало, вероятно, это:

from . import db
if 'table1' not in db.metadata.tables:
    load_table('table1')

С оглядкой на многопоточность можно обернуть load_table блокировками по ключу.

Исходная версия ei-grad, :

Просто с большой вероятностью твое dbdata это MetaData.tables, можно не плодить сущности, все нужные методы у тебя уже есть. Если ты не собираешься использовать ORM да ещё с разными реализациями - то дополнительная прослойка не нужна.

общий метод инициализации для всех скриптов, который бы устанавливал то, как скрипт должен работать с БД

Суть в том, чтобы явно перенести логику подготовки БД в отдельный кусок кода, например, класс типа такого:

class CommandManager:

    def __init__(self):
        self.tables = set()
        self.scripts = []

    def register_script(self, tables_for_script, script):
        self.scripts.append(script)
        self.tables.add(tables_for_script)

    def run(self):
        for table in self.tables:
            self.load_metadata(table)
        for script in self.scripts:
            self.run_script(script)

В методе run_script - реализовать запуск скриптов с передачей им необходимых параметров.

Метод register_script вызывать, и создавать сам CommandManager, можно по-разному. Например сделать синглтон (просто глобальную переменную в модуле, модули в Python - сами по себе синглтоны) и обернуть все скрипты декораторами с указанием списков таблиц. Или в какой-нибудь функции main явно вызвать register_script по определенному там же списку скриптов.

Но, повторюсь, это может быть оверкилл, и всё что тебе не хватало, вероятно, это:

if 'table1' not in shared.metadata.tables:
    load_table('table1')

С оглядкой на многопоточность можно обернуть load_table блокировками по ключу.