SQLAlchemy系列教程:理解SQLAlchemy元数据

news/2025/3/6 1:08:35/

SQLAlchemy是Python开发人员的强大ORM工具。SQLAlchemy中的元数据是对象-关系映射配置的集合,允许开发人员无缝地定义和使用数据库模式。
在这里插入图片描述

使用元数据

SQLAlchemy中的元数据充当各种数据库描述符(如表、列和索引)的容器。这使开发人员能够通过高级Python构造生成和管理数据库结构。让我们通过实际示例探索如何在SQLAlchemy中使用元数据。

基本用法

from sqlalchemy import MetaData, Table, Column, Integer, Stringmetadata = MetaData()
users_table = Table('users', metadata,Column('id', Integer, primary_key=True),Column('name', String)
)

在上面的代码片段中,我们在MetaData实例中创建了一个Table对象,定义了一个带有ID和名称的简单users表。

抽取现有数据库模式

from sqlalchemy import create_engine, MetaDataengine = create_engine('sqlite:///example.db')
metadata = MetaData()
metadata.reflect(bind=engine)for table_name in metadata.tables:print(table_name)

这个示例演示了如何将现有数据库模式加载到元数据对象中,以便在SQLAlchemy中进行自省或交互。

定义关系

from sqlalchemy import ForeignKeyaddresses_table = Table('addresses', metadata,Column('id', Integer, primary_key=True),Column('user_id', None, ForeignKey('users.id')),Column('email', String, nullable=False)
)

在这里,我们定义了用户和地址之间的一对多关系,其中每个地址通过外键与用户相关联。

SQLAlchemy_56">SQLAlchemy使用元数据

from sqlalchemy.orm import mapper, sessionmakerclass User(object):passmapper(User, users_table)
Session = sessionmaker(bind=engine)
session = Session()new_user = User()
new_user.id = 1
new_user.name = 'John Doe'
session.add(new_user)
session.commit()

上面的例子将一个Python类映射到定义的users表,并演示了使用ORM会话插入一条新记录。

mapper 的作用:
  • 对象关系映射(ORM)mapper 函数用于将 Python 类(如 User)与数据库表(如 users_table)进行映射。这样,你可以通过操作 Python 对象来间接操作数据库表中的数据。
  • 属性关联:通过映射,User 类的实例将对应 users 表中的行,类的属性(如 idname)将对应表的列。
SQLAlchemy__82">现代 SQLAlchemy 的推荐做法:

在现代 SQLAlchemy(版本 1.4 及以上)中,推荐使用 Declarative 扩展来进行 ORM 映射,而不是直接使用 mapper。Declarative 提供了更简洁和直观的方式来定义模型类。

使用 Declarative 的示例:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmakerBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)# 创建引擎和会话
engine = create_engine('sqlite:///example.db', echo=True)
Session = sessionmaker(bind=engine)
session = Session()

这种方式自动处理了映射过程,减少了样板代码,使代码更简洁易读。

高级元数据用法

可以自定义SQLAlchemy的元数据,以利用命名约定、显式模式和高级数据类型。它还可以用于动态生成表和查询元数据属性。

metadata = MetaData(naming_convention={"ix": 'ix_%(column_0_label)s',"uq": "uq_%(table_name)s_%(column_0_name)s","ck": "ck_%(table_name)s_%(constraint_name)s","fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s","pk": "pk_%(table_name)s"
})

这个例子展示了索引、唯一约束、检查约束、外键和主键的自定义命名约定。

从元数据生成DDL

metadata.create_all(engine)

create_all方法为元数据实例中包含的所有表和约束向数据库发出适当的DDL命令。

实战案例

在实际项目中,使用 SQLAlchemy 进行数据库操作时,以下是一些最佳实践:

a. 使用 Declarative 定义模型

如上所示,使用 Declarative 扩展定义模型类,不仅简化了代码,还提高了可维护性。

b. 分离模型、数据库引擎和会话管理

将模型定义、数据库引擎的创建和会话管理分离到不同的模块中,有助于组织代码,增强可重用性和可测试性。

示例结构:

project/
│
├── models.py          # 定义模型类
├── database.py        # 创建引擎和会话
└── main.py            # 主程序逻辑

models.py:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, StringBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)

database.py:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import BaseDATABASE_URL = "sqlite:///example.db"engine = create_engine(DATABASE_URL, echo=True)
SessionLocal = sessionmaker(bind=engine)def init_db():Base.metadata.create_all(bind=engine)

main.py:

from database import SessionLocal, init_db
from models import Userdef main():init_db()session = SessionLocal()new_user = User(name='John Doe')session.add(new_user)session.commit()session.close()if __name__ == "__main__":main()

一般开发阶段通过init_db()创建表,在生产环境中,建议在部署脚本或初始化流程中手动创建表,以确保数据库结构的可控性和一致性。此外,可以使用迁移工具(如 Alembic)来管理数据库模式的变更。

最后总结

SQLAlchemy Metadata提供了一个健壮的接口,可以在Python环境中处理数据库的模式。通过提供的示例,我们探索了元数据的基本概念,以及如何利用它们来简化数据库操作。


http://www.ppmy.cn/news/1576942.html

相关文章

ROS2软件调用架构和机制解析:Publisher创建

术语 DDS (Data Distribution Service): 用于实时系统的数据分发服务标准,是ROS 2底层通信的基础RMW (ROS Middleware): ROS中间件接口,提供与具体DDS实现无关的抽象APIQoS (Quality of Service): 服务质量策略,控制通信的可靠性、历史记录、…

【Android】Compose初识

文章目录 1.Compose是什么2.Compose优势3.可组合函数4.布局5.配置布局6.Material Design7.列表与动画8.声明式UI9.组合10.重组 1.Compose是什么 Jetpack Compose是谷歌开发的一个现代的、声明式的UI工具包,用于构建原生的Android应用程序界面。它简化了创建复杂用户…

【Azure 架构师学习笔记】- Azure Databricks (15) --Delta Lake 和Data Lake

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (14) – 搭建Medallion Architecture part 2 前言 ADB 除了UC 这个概念之外,前面【Azure 架构师学习笔记】- Azure Databricks (1…

数据结构——布隆过滤器

目录 布隆过滤器概念 布隆过滤器实现 哈希函数 布隆过滤器类 加入到布隆过滤器 判断在不在 测试一下 为啥不写删除? 测试一下误判率 布隆过滤器概念 布隆过滤器也是一种位图结构,它可以快速的判断字符串在不在位图中。它的优点是节省空间。 …

计算机毕业设计SpringBoot+Vue.js工作流程管理系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

ML.NET库学习020:基于 ML.NET + Tiny Yolo的实时视频流物体检测应用

文章目录 ML.NET库学习020:基于 ML.NET Tiny Yolo的实时视频流物体检测应用项目主要目的和原理项目概述实现的主要功能主要流程步骤关键技术 主要功能步骤1. 加载和初始化 ONNX 模型2. 启动摄像头视频流捕获3. 处理每一帧图像4. 绘制检测结果 数据集和预测数据处理…

Redis7——进阶篇(一)

前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…

虚拟机IP的配置,让它上网

首先打开虚拟机,点击上面的虚拟网络编辑器。 选择VMnet8,IP地址:192.168.10.0,子网掩码:255.255.255.0 然后,点击NAT设置,进入填网关:192.168.10.2 (2)配置Wi…