簡體   English   中英

通過SQLAlchemy數據庫反射創建模型

[英]Model Creation by SQLAlchemy database reflection

我目前正在使用sqlalchemy的金字塔系統。

該系統將包括存儲在數據庫表中的模型(我們稱之為Base)。 用戶可以在運行時擴展此模型。 基本上,用戶應該能夠繼承Base並創建一個新模型(讓我們稱之為'Child')。 Childs應存儲在另一個數據庫表中。

所有可用的示例似乎都處理預定義模型上的數據庫反射。 通過數據庫反射生成完整模型類的最佳方法是什么?

這似乎與“數據庫反射”無關,而是與動態表創建有關。 這是一個非常危險的操作,並且通常不贊成。

您應該嘗試考慮如何為用戶想要添加到Base的可能結構建模,並圍繞它設計架構。 有時,當您不知道列可能是什么時,這些靈活的結構可以從垂直表中受益匪淺。

不要忘記,有一整類數據存儲系統可以為“無模式”模型提供更靈活的支持。 像Mongo或ZODB這樣的東西在這里可能更有意義。

大多數這個概念對我來說都很好,但是我無法將現有表綁定到新創建的類,該類使用多表繼承。 以下是一些使事情更清晰的代碼:

Base.metadata.reflect(bind=Session.bind)
table = Base.metadata.tables['anExistingTable']
Extension = type('Extension', (BaseClass,), {})
orm.mapper(Extension, table, inherits=orm.class_mapper(BaseClass),
    polymorphic_identity='extension')

這會導致以下錯誤:

ArgumentError: Class '<class 'Extension'>' already has a primary mapper defined. Use non_primary=True to create a non primary Mapper. clear_mappers() will remove *all* current mappers from all classes.

您是否知道為什么在剛剛創建的類上定義了主映射器?

只需定義一個生成器方法

def mapClass(class_name, table_name):
    # Allows to generate previously undefined mapped classes, remapping when necessary
    #For security reason this will only map a class 
    #when class is not previously declared
    #or if declared, when is a MappableClass subclass, 
    #this way we prevent to map any class.
    #Even when not able to return a mapped class it will return corresponding class_name class
    #if so, we'll get an error when accessing non existing MappableClass members
    if not globals.has_key(class_name):
        cls=type(class_name, (MappableClass,), {} )
        globals[class_name]=cls
    else:
        cls=globals[class_name]
    if issubclass(cls,MappableClass):
        tab_obj=Table(table_name,meta,autoload=True)
        mapper(cls, tab_obj)
    return cls

或繼承發電機類作為這里我增加了發電機方法在答題的類為靜態的,所以我可以同時使用以前聲明的子類或新dinamically創建的,那些。

我剛剛使用以下代碼片段解決了上述問題:

table = Table('anExistingTable', Base.metadata, autoload=True, autoload_with=Session.bind)
Extension = type('Extension', (BaseClass,), {
    '__table__' : table,
    '__mapper_args__' : {
        'inherits': BaseClass,
        'polymorphic_identity': 'extension'
    }
})

但是,我不知道為什么第一次嘗試沒有成功...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM