我正在开发一个包含电子零件数据的SQL数据库的python接口。有一个基类表示所有部件类型类继承的主部件号引用表。每个子类都有自己的表来保存参数数据。还有一些其他类包含供应商数据等信息,其中每个Part实例都有一个或多个实例。 继承层次结构如下所示:
Part
PartTypeA
PartTypeB
Part类与描述供应商信息等的其他表有几个关系。
我有一个单独的DatabaseManager类来处理向数据库添加部件(管理和控制SQLAlchemy引擎的实例)。即使表是在其他类中定义的,如何使用SQLAlchemy为所有表发出CREATE语句?
我尝试了以下(这是在数据库管理器类中):
self.db_engine = create_engine(db_uri, echo=False)
Part.metadata.create_all(self.db_engine)
这实际上有效,但我不确定为什么(也许是因为Part包含SQLAlchemy与某些表的关系而其他表都是Part的子类?)。 SQLAlchemy文档中的示例似乎假设引擎定义在与数据库表相同的位置。
有谁知道这是否是正确的方法?如果没有,SQLAlchemy发出CREATE语句的正确方法是什么?
答案 0 :(得分:0)
这是正确的方法
关键是metadata.create_all(db_engine)
,它基本上会创建metadata
实例中定义的所有数据对象。因此,您的使用是正确的,其中Part.metadata
只是获取metadata
实例的一种方式,所有其他映射对象都映射到该实例。虽然,您的DatabaseManager
类可能会直接引用MetaData
实例。
答案 1 :(得分:0)
我尝试将此代码移植到MySQL,但是当我使用sqlite时,没有发布create语句。以下是我在MySQL中使用代码所做的工作:
# Create an instance of each class and bind it's metadtata
items = []
for cls in self.get_class_list():
temp = cls()
temp.__table__.metadata = metadata
items.append(temp)
# Issue CREATE statements
for item in items:
try:
item.__table__.create()
except Exception as e:
print e