0

我正在研究包含电子零件数据的 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 语句的正确方法是什么?

4

2 回答 2

0

这是正确的方法。
关键是metadata.create_all(db_engine),它将基本上创建metadata实例中定义的所有数据对象。因此,您的用法是正确的,这Part.metadata只是获取metadata实例的一种方法,所有其他映射对象都映射到该实例。虽然,您的DatabaseManager类可能会MetaData直接引用该实例。

于 2012-06-04T12:02:55.327 回答
0

我尝试将此代码移植到 MySQL,但没有像使用 sqlite 时那样发出创建语句。这是我为使代码在 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
于 2012-09-12T17:09:20.823 回答