代码/示例
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Run Code Online (Sandbox Code Playgroud)
如果我运行print(Base)然后我得到结果:
<class 'sqlalchemy.ext.declarative.api.Base'>
Run Code Online (Sandbox Code Playgroud)
(即Base是由函数创建的类declarative_base)。
如果我跑print(Base.metadata)然后我得到
Metadata(bind=engine(postgres//:user:password@host/database))
Run Code Online (Sandbox Code Playgroud)
但如果是一个类并且是一个对象,那么究竟如何print(Base.metadata)运行呢?Basemetadata
两者是如何联系的?
我可以理解元数据是否是一个类属性,但据我了解,它不是,那么它是如何工作的呢?
我错过了 python 语法中的某些内容吗?
查看元数据代码:
from sqlalchemy import MetaData
metadata = MetaData()
Run Code Online (Sandbox Code Playgroud)
metadata这里和的定义是什么MetaData?它们都是对象吗?是MetaData()函数还是别的什么?
根据 SQLAlchemy 文档MetaData是:
一个容器对象,它将所描述的数据库(或多个数据库)的许多不同功能组合在一起。
但如果它是一个对象,那么它如何像函数一样运行:Metadata()?
Base和是如何联系的?metadataBase.metadata如何运行命令( )?metadata和和之间有什么区别? 的定义MetaData是什么MetaData()?你想太多了。在Python中 一切都是对象。类、函数、实例、数字、字符串、列表、字典、模块……,一切。
您正在查看的 SQLAlchemy 对象没有什么不同,它们确实没有什么特别之处。
是的,该declarative_base()函数返回一个新的类对象,您将其分配给 name Base。该类具有属性,其中一个属性名为metadata。所有Python类都有属性,它们可以指向你喜欢的任何对象:
class Foo:
def __init__(self, name):
self.name = name
def print(self):
print(f"Hello, {self.name}!")
class Bar:
spam = Foo("World")
Run Code Online (Sandbox Code Playgroud)
上面的类Bar有一个属性spam,它是该类的实例Foo。您可以调用它的方法:
>>> Bar.spam.print()
Hello, World!
Run Code Online (Sandbox Code Playgroud)
请注意,它Bar仍然是一个类,并且Bar.spam是该类的实例Foo:
>>> Bar
<class '__main__.Bar'>
>>> Bar.spam
<__main__.Foo object at 0x10d43c650>
>>> type(Bar.spam)
<class '__main__.Foo'>
Run Code Online (Sandbox Code Playgroud)
因为Bar它只是另一个对象,所以您也可以传递它、将其放入列表中或从函数返回它。declarative_base()为您构造一个带有属性的类对象,并将其返回给调用者。
同样,Base.metadata只是该类的一个实例MetaData:
>>> type(Base.metadata)
<class 'sqlalchemy.sql.schema.MetaData'>
Run Code Online (Sandbox Code Playgroud)
你的对象也是如此metadata = MetaData()。
请注意,如果您仅运行Base = declarative_base()而不执行其他操作,则MetaData实例实际上不会显示任何数据库连接信息:
>>> Base.metadata
MetaData(bind=None)
Run Code Online (Sandbox Code Playgroud)
这是因为您实际上并未将元数据连接到数据库会话。一旦您开始将数据库与引擎连接并开始使用您通过子类化定义的模型Base,元数据对象在某些时候将需要了解有关数据库的详细信息(例如支持哪种 SQL 方言)及其“将受到 SQLAlchemy 的约束。
| 归档时间: |
|
| 查看次数: |
9418 次 |
| 最近记录: |