代码/示例
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()?我想动态地将列添加到数据库中的表中,因为我不想在 SQLalchemy 类中设置表时指定所有列
为了解决这个问题,我使用 alembic 将列添加到表中,但我遇到了问题。
在我的 python 脚本中,我定义了一个类,如下所示。
DATABASE_URL_dev = "postgresql+psycopg2://user:password@localhost:5432/testdb"
engine = create_engine(DATABASE_URL_dev)
Base = declarative_base(engine)
class my_class1(Base):
__tablename__ = "test1"
id = Column(Integer, primary_key=True)
list = Column(String)
def loadsession():
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
return session
session = loadsession()
Run Code Online (Sandbox Code Playgroud)
现在我想向数据库中的表 test1 添加一个新列(“new_column”)。
然后,我使用 Alembic 按照https://alembic.sqlalchemy.org/en/latest/tutorial.html上的说明进行操作,并执行了以下操作: