如何使用 sqlalchemy declarative base 多層次繼承
declarative_base
建立的基類可以透過多層次的繼承建立繼承關係。這允許你在資料庫中建立具有繼承結構的表。在我使用某資料庫做中轉的時候,經常會遇到各種各樣的問題,例如下面的問題,透過記錄並附上完美的解決方案,以便為查詢更加方便。
問題背景
from sqlalchemy import Column, Integer, Text
from sqlalchemy. ext. declarative import declarative_base, declared_attr
from sqlalchemy. orm import sessionmaker
engine = sqlalchemy. create_engine( 'sqlite:///monDom5.db')
class Base( object):
"""base for all table classes"""
__abstract__ = True
__table_args__ = { 'autoload': True, 'autoload_with': engine}
@declared_attr
def __tablename__( cls):
return cls. __name__. lower()
Base = declarative_base( cls = Base)
class TransMap_HgmIntronVector( Base):
AlignmentId = Column( Text, primary_key = True)
但是需要為每個 Hgm 基類的例項指定 AlignmentId 列。相反,我想這樣做,但在嘗試實際使用它時出現
sqlalchemy.exc.InvalidRequestError
錯誤:
from sqlalchemy import Column, Integer, Text
from sqlalchemy. ext. declarative import declarative_base, declared_attr
from sqlalchemy. orm import sessionmaker
engine = sqlalchemy. create_engine( 'sqlite:///monDom5.db')
class Base( object):
"""base for all table classes"""
__abstract__ = True
__table_args__ = { 'autoload': True, 'autoload_with': engine}
@declared_attr
def __tablename__( cls):
return cls. __name__. lower()
# model for all Hgm tables
class Hgm( Base):
__abstract__ = True
AlignmentId = Column( Text, primary_key = True)
Base = declarative_base( cls = Hgm)
class TransMap_HgmIntronVector( Hgm):
pass
metadata = Base. metadata
Session = sessionmaker( bind = engine)
session = Session()
導致錯誤
>>> metadata = Base.metadata
>>> Session = sessionmaker(bind=engine)
>>> session = Session()
>>> session.query(TransMap_HgmIntronVector).all()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/cluster/home/ifiddes/anaconda2/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1260, in query
return self._query_cls(entities, self, **kwargs)
File "/cluster/home/ifiddes/anaconda2/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 110, in __init__
self._set_entities(entities)
File "/cluster/home/ifiddes/anaconda2/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 118, in _set_entities
entity_wrapper(self, ent)
File "/cluster/home/ifiddes/anaconda2/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 3829, in __init__
"expected - got '%r'" % (column, )
sqlalchemy.exc.InvalidRequestError: SQL expression, column, or mapped entity expected - got '<class '__main__.TransMap_HgmIntronVector'>'
解決方案
官方文件中提供了一個示例。特別地,
__abstract__ = True
是沒有必要的。這樣可以正常工作:
class Base( object):
@declared_attr
def __tablename__( cls):
return cls. __name__. lower()
class Hgm( Base):
AlignmentId = Column( Text, primary_key = True)
Base = declarative_base( cls = Hgm)
class TransMap_HgmIntronVector( Base):
pass
請注意,使用混合類來代替具有相同列可能更簡單。
透過上面的詳細步驟可以知道
Person
類是基類,
Employee
類繼承自
Person
,
Manager
類繼承自
Employee
。每個類都對應一個資料庫表,並且在子類中透過
ForeignKey
建立了關聯。透過多層次繼承,你可以在資料庫中建立類似於類的繼承關係的表結構。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006427/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多繼承 與 多重繼承繼承
- 多繼承繼承
- 繼承與多型繼承多型
- 繼承和多型繼承多型
- 多型和繼承多型繼承
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- python 基礎之繼承、重寫、多繼承Python繼承
- static方法在繼承中如何使用?繼承
- 『無為則無心』Python物件導向 — 55、多層繼承和繼承中的私有成員Python物件繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- java繼承與多型Java繼承多型
- 繼承+多型+抽象類繼承多型抽象
- Castle 多繼承選擇AST繼承
- Scala多繼承以及AOP繼承
- Java 如果阻止二次繼承Java繼承
- JavaScript 的繼承與多型JavaScript繼承多型
- Python 繼承 和 多型Python繼承多型
- OOP的多型和繼承OOP多型繼承
- TypeScript(5)類、繼承、多型TypeScript繼承多型
- Scala 多繼承 & 依賴注入繼承依賴注入
- Javascript的繼承與多型JavaScript繼承多型
- python 多繼承詳解Python繼承
- 封裝、繼承和多型封裝繼承多型
- CSS學習摘要-層疊和繼承CSS繼承
- Java繼承的使用Java繼承
- tour cpp: std::variant 實現無繼承層次的訪問者模式繼承模式
- 原型,繼承——原型繼承原型繼承
- 菱形繼承,虛繼承繼承
- 一次掌握 JavaScript 原型與繼承JavaScript原型繼承
- Javascript如何實現繼承JavaScript繼承
- CSS系列:CSS的繼承與層疊特性CSS繼承
- JS中的多種繼承方式JS繼承
- Java 繼承與多型實驗Java繼承多型
- C中的繼承和多型繼承多型
- C++多繼承的細節C++繼承
- Python的多重繼承如何使用?python教程Python繼承
- C++繼承詳解:共有(public)繼承,私有(private)繼承,保護(protected)繼承C++繼承
- 一次 outline 去除經驗(非繼承屬性,看著像繼承)繼承