SQL Алхимия: сколько операторов "Base = Declarative_base ()" требуется? - PullRequest
3 голосов
/ 23 января 2020

Я только начинаю изучать SQL Алхимия, и для моего первого проекта моя цель - создать два отдельных файла БД SQLITE, каждый с одной таблицей. С первой попытки я попытался сделать следующее:

Base = declarative_base() 

class HostInfo(Base):
    __tablename__ = 'hosts'

    id = Column(Integer, primary_key = True)
    ...

host_info_engine = create_engine('sqlite:///hostinfo.db', echo=False)
Base.metadata.create_all(host_info_engine)


class RecoveryLogger(Base):
    __tablename__ = 'recovery_entries'

    id = Column(Integer, primary_key=True)
    ....

recovery_log_engine = create_engine('sqlite:///recovery_logger.db', echo=False)
Base.metadata.create_all(recovery_log_engine)

По большей части это сработало, но одним из непреднамеренных побочных эффектов было то, что он создал две таблицы в hostinfo.db , и это не то, что я хотел - я хотел только одну таблицу в каждом из файлов базы данных. После нескольких царапин на голове я смог осмотреть Base и обнаружил, что он содержит все столбцы из обоих моих объявлений класса. Я решил исправить это, вставив еще один оператор Base = Declarative_base () перед объявлением второго класса ( RecoveryLogger ), и это, похоже, решило проблему.

Это отбросило меня за все oop, потому что я не думал, что информация из дочернего класса вернется обратно в родительский класс, но кажется, что это так, или, по крайней мере, Base кажется быть каким-то особым объектом, который захватывает все детали из любого класса, основанного на нем.

Итак, каков правильный путь к go по этому поводу? Правильно ли вставил второй оператор Base = Declarative_base () ? go? Должен ли я использовать другое имя (вместо Base ) для каждого назначения Declarative_base ()?

Спасибо!

1 Ответ

1 голос
/ 10 февраля 2020

Ваш метод в порядке. Вы действительно должны объявить отдельные базы для отдельных баз данных. И, вероятно, будет хорошей идеей дать двум Базам разные имена, например, HostBase и LoggerBase, чтобы улучшить расширяемость и возможность повторного использования кода. Таким образом, вы можете использовать отдельные базы для добавления и удаления таблиц из обеих баз данных (файлов) без путаницы. Рефакторинг / изменение порядка также проще. Ниже приведен пример переупорядочения.

HostBase = declarative_base()
LoggerBase = declarative_base() 

class HostInfo(HostBase):
    __tablename__ = 'hosts'

    id = Column(Integer, primary_key = True)
    ...

class RecoveryLogger(LoggerBase):
    __tablename__ = 'recovery_entries'

    id = Column(Integer, primary_key=True)
    ...

host_info_engine = create_engine(r'sqlite://hostinfo.db', echo=False)
HostBase.metadata.create_all(host_info_engine)

recovery_log_engine = create_engine(r'sqlite://recovery_logger.db', echo=False)
LoggerBase.metadata.create_all(recovery_log_engine)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...