python - SQLAlchemy : how many "Base = declarative_base()" statements are required?

标签 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)吗?

谢谢!

最佳答案

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

关于python - SQLAlchemy : how many "Base = declarative_base()" statements are required?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59871330/

相关文章:

postgresql - 从至少有 2 条评论的类(class)开始选择评论最多的类(class)

Python输出编码

jquery - Pyramid 如何处理 xhr.abort()

javascript - 使用 Python 3.5.1 和 Selenium 2.53.2 选择并单击网站按钮时出现问题

python - 为什么 Django 不重置 SQLite3 中的序列?

python - 如何使用sqlalchemy进行sql?

python - 如何在 Selenium 中使用命令行选项启动 PhantomJS?

sqlite - 在 sqlite 中使用 LIKE 区分大小写的便捷方法

java - 从数据库内容填充微调器 (SQLite)

python - 向已有 select_from() 的 SQL Alchemy 表达式添加连接