SQL Alchemy:需要多少个“ Base = declarative_base()”语句?

时间:2020-01-23 03:48:26

标签: python sqlite sqlalchemy

我刚刚开始学习SQL Alchemy,对于我的第一个项目,我的目标是创建两个单独的SQLITE DB文件,每个文件都有一个表。第一次尝试时,我尝试了以下操作:

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 ,发现它包含了我的两个类声明中的所有列。我解决此问题的方法是在第二个类声明( RecoveryLogger )之前插入另一个 Base = declarative_base()语句,这似乎可以解决问题。

这让我陷入了循环,因为我不认为子类的信息会返回到父类,但似乎确实如此,或者至少是 Base 似乎是一种特殊的对象,可以从基于该对象的任何类中获取所有详细信息。

那么,解决这个问题的正确方法是什么?插入第二个 Base = declarative_base()语句是否是正确的方法?我应该为每个declarative_base()分配使用不同的名称(代替 Base )吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的方法很好。实际上,应该为单个数据库声明单独的Base。给这两个Base提供不同的名称可能是个好主意,例如HostBaseLoggerBase,以提高代码的可扩展性和可重用性。这样,您可以使用各个基础在两个数据库(文件)之间添加和删除更多表,而不会造成混淆。重构/重新排序也更加容易。以下是重新排序的示例。

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)
相关问题