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



我刚刚开始学习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(吗?

谢谢!

你的方法很好。您确实应该为各个数据库声明单独的基础。给两个基地起不同的名字可能是个好主意,例如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)

最新更新