gpt4 book ai didi

python - Base.metadata 在 Sqlalchemy 中如何工作?

转载 作者:行者123 更新时间:2023-12-05 02:10:36 26 4
gpt4 key购买 nike

代码/例子

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

如果我运行 print(Base) 然后我得到结果:

<class 'sqlalchemy.ext.declarative.api.Base'>

(即 Base 是由函数 declarative_base 创建的类)。

如果我运行 print(Base.metadata) 然后我得到

Metadata(bind=engine(postgres//:user:password@host/database))

但是如果 Base 是一个类而 metadata 是一个对象,print(Base.metadata) 到底是如何运行的呢?

两者有什么联系?

我可以理解元数据是否是类属性,但据我了解它不是,那么它是如何工作的?

我是否遗漏了 python 语法中的某些内容?

查看元数据代码:

from sqlalchemy import MetaData
metadata = MetaData()

metadataMetaData 的定义是什么?它们都是对象吗?MetaData() 是函数还是其他?

根据 SQLAlchemy 文档 MetaData 是:

a container object that keeps together many different features of a database (or multiple databases) being described.

但是,如果它是一个对象,那么它如何作为类似于函数的东西运行:Metadata()

总结:

  • 如果一个是类,另一个是对象,Basemetadata 是如何连接的?
  • 如何运行命令 (Base.metadata)?
  • metadataMetaData 有什么区别?MetaData() 的定义是什么?

最佳答案

你想多了。在 Python 中,一切皆对象。类、函数、实例、数字、字符串、列表、字典、模块……一切

您正在查看的 SQLAlchemy 对象没有什么不同,它们真的没有什么特别之处。

是的,declarative_base() 函数返回一个新的类对象,一个您分配给名称 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")

上面的类 Bar 有一个属性 spam,它是类 Foo 的一个实例。您可以在其上调用方法:

>>> Bar.spam.print()
Hello, World!

注意 Bar 仍然是一个类,Bar.spamFoo 类的一个实例:

>>> Bar
<class '__main__.Bar'>
>>> Bar.spam
<__main__.Foo object at 0x10d43c650>
>>> type(Bar.spam)
<class '__main__.Foo'>

因为 Bar 只是另一个对象,您还可以传递它、将它放在列表中或从函数中返回它。 declarative_base() 为您构造一个具有属性的类对象,并将其返回给调用者。

同样,Base.metadata 只是 MetaData 类的一个实例:

>>> type(Base.metadata)
<class 'sqlalchemy.sql.schema.MetaData'>

您的 metadata = MetaData() 对象也是如此。

请注意,如果您仅运行 Base = declarative_base() 而没有执行其他操作,则 MetaData 实例实际上不会显示任何数据库连接信息:

>>> Base.metadata
MetaData(bind=None)

那是因为您实际上并未将元数据连接到数据库 session 。一旦开始 connecting a database with an engine并开始使用您通过子类化 Base 定义的模型,元数据对象在某些时候将需要了解更多关于数据库的细节(例如支持哪种 SQL 方言)并且它会受 SQLAlchemy 约束。

关于python - Base.metadata 在 Sqlalchemy 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58598098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com