繁体   English   中英

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

[英]SQL Alchemy: how many "Base = declarative_base()" statements are required?

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

谢谢!

你的方法没问题。 您确实应该为各个数据库声明单独的基础。 为两个 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM