gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:16:27 35 4
gpt4 key购买 nike

我刚刚开始学习 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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com