我有一个简单的SQLAlchemy应用:当我使用SqlAlchemy子类化`declarative_base`时会得到什么?
import sqlalchemy as sa
import sqlalchemy.ext.declarative as dec
import sqlalchemy.engine.url as saurl
import sqlalchemy.orm as saorm
import sqlalchemy.schema as sch
import abc
class ItemTable():
__tablename__ = 'book_items'
@abc.abstractmethod
def _source_key(self):
pass
rowid = sa.Column(sa.Integer, sa.Sequence('book_page_id_seq'), primary_key=True)
src = sa.Column(sa.String, nullable=False, index=True, default=_source_key)
dlState = sa.Column(sa.Integer, nullable=False, index=True, default=0)
url = sa.Column(sa.String, nullable=False, unique=True, index=True)
# [...snip...]
Base = dec.declarative_base(cls=ItemTable)
class TestItem(Base):
_source_key = 'test'
def __init__(self, *args, **kwds):
# Set the default value of `src`. Somehow, despite the fact that `self.src` is being set
# to a string, it still works.
self.src = self._source_key
print(self)
print(type(self))
print(super())
print("IsInstance of ItemTable", isinstance(self, ItemTable))
print("IsInstance of Table", isinstance(self, sch.Table))
super().__init__(*args, **kwds)
def test():
test = TestItem()
if __name__ == "__main__":
test()
的想法是,表架构在ItemTable
定义,并且某些部件的属性被定义为抽象的。这可以确保子类定义某些成员属性,然后通过一些__init__()
hijinks将其用作实例化子类的值缺省值。
无论如何,这很有用。
我遇到的问题是,我不能为我的生活弄清楚什么是地狱父母TestItem(Base)
是。我知道它从ItemTable()
继承,但dec.declarative_base(cls=ItemTable)
的中间继承将大量方法和“东西”插入到TestItem(Base)
中,我不知道那里有什么,或者它来自哪里。
我敢肯定有一些功能,从而使我的生活轻松了许多关于在修改表中的行,但因为我不知道什么是TestItem(Base)
实际上从继承,我没有想法在SqlAlchemy文档中查看所有内容。
文档不说的declarative_base()
:
新的基类将给予产生适当
Table
对象,并基于在类中声明了该 信息适当mapper()
调用元类和该类的任何子类 。
这让我觉得,可能TestItem(Base)
是儿童类的Table
,但isinstance(self, sch.Table)
返回false,所以无论是不是,或元类muckery被彻底打破isinstance
。
此外,TestItem(Base)
是一个儿童类的Table
就没有任何意义逻辑,因为你得到的TestItem(Base)
情况下返回在查询,使用表示行每个实例。
无论如何,我完全困惑。
更新:
@Veedrac在评论中指出,ClassName.mro()
为您提供了完整的继承。在这种情况下:
TestItem.mro()
- >
[<class '__main__.TestItem'>, <class 'sqlalchemy.ext.declarative.api.Base'>, <class '__main__.ItemTable'>, <class 'object'>]
这里的有趣的事情是,也有sqlalchemy.ext.declarative.api.Base
为零情况下的SQLAlchemy文档的任何地方英寸
沿着sqlalchemy.ext.declarative.api
路径记录的唯一东西是_declarative_constructor
,并且在那里有2个无益的句子。
'ClassName.mro()'为您提供完整的,有序的继承层次结构。那是你在找什么? – Veedrac 2014-09-21 05:20:46
@Veedrac - 嗯.....这是*的东西*。它告诉我:mro [,,,]'。这里唯一有趣的地方是'sqlalchemy.ext.declarative.api.Base'在SqlAlchemy文档中不存在**。 –
2014-09-21 05:23:44
SqlAlchemy **拼命**需要某种autodoc工具。它甚至不需要任何其他的东西,只有方法名和一个继承图,这两者都可以自动完成。 – 2014-09-21 05:34:39