Как выполнить инструкции CREATE в SQLAlchemy для таблиц, описанных в других классах?

Я работаю над интерфейсом Python для базы данных SQL, содержащей данные об электронных деталях. Существует базовый класс, представляющий справочную таблицу номеров основных деталей, от которой наследуются все классы типов деталей. Каждый подкласс имеет свою собственную таблицу для хранения параметрических данных. Есть также несколько других классов, содержащих такую ​​информацию, как данные о поставщиках, один или несколько экземпляров которых есть у каждого экземпляра 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?


person Josh    schedule 01.06.2012    source источник


Ответы (2)


Это правильный метод.
Ключ metadata.create_all(db_engine), который в основном создает все объекты данных, определенные в экземпляре metadata. Таким образом, ваше использование правильное, где Part.metadata - это просто способ получить экземпляр metadata, на который сопоставляются все другие сопоставленные объекты. Хотя ваш класс DatabaseManager потенциально может иметь прямую ссылку на экземпляр MetaData.

person van    schedule 04.06.2012

Я попытался перенести этот код в 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
person Josh    schedule 12.09.2012