当前位置: 首页 > news >正文

PYTHON利用SQLAlchemy库高效操作关联的数据表

SQLAlchemy是一个Python库,用于处理关系型数据库的ORM(对象关系映射)和SQL表达式的生成。它提供了许多功能,包括:

  1. ORM(对象关系映射):允许将数据库表映射到Python对象,使开发人员可以使用Python代码而不是SQL语句来操作数据库。

  2. 数据库连接管理:SQLAlchemy管理数据库连接池,处理连接的创建、关闭和连接池的配置,从而提高了性能和资源利用率。

  3. SQL表达式语言:SQLAlchemy提供了强大的SQL表达式语言,可以用于构建SQL查询、插入、更新和删除等操作,同时支持数据库的不同类型和方言。

  4. 事务管理:支持数据库事务,确保一系列数据库操作的原子性和数据一致性。

  5. 连接多种数据库:SQLAlchemy支持多种关系型数据库,包括SQLite、MySQL、PostgreSQL、Oracle等,使得代码可以跨不同数据库进行移植。

  6. 数据模型定义:使用SQLAlchemy,可以定义数据模型类,这些类可以映射到数据库表,简化了数据库结构的管理。

  7. 查询构建:SQLAlchemy允许使用Python代码来构建复杂的查询,支持过滤、排序、连接、子查询等功能。

  8. 双向关系:通过定义双向关系,可以轻松地在数据模型之间进行导航和访问相关的数据。

  9. 批量操作:支持批量插入、批量更新和批量删除等操作,提高了数据库操作的效率。

  10. 数据类型转换:SQLAlchemy支持将Python数据类型与数据库数据类型进行映射,处理数据的序列化和反序列化。

  11. 表间关联:支持多表之间的关联,包括一对一、一对多和多对多等关系的建立和管理。

总之,SQLAlchemy是一个功能强大的工具,用于处理数据库交互和数据持久化,它提供了高度抽象的方式来操作数据库,同时支持灵活的SQL表达式,使开发人员更容易管理和操作数据库。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import declarative_base
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship, joinedload
from sqlalchemy import UniqueConstraint
from sqlalchemy import func
from sqlalchemy import distinct# 创建引擎
engine = create_engine('sqlite:///test456.db')# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 创建 SQLAlchemy 数据模型基类
Base = declarative_base()# 定义数据模型类,继承自 Base
class Address(Base):__tablename__ = 'addresses'id = Column(Integer, primary_key=True)user_id = Column(Integer, ForeignKey('users.id'))street = Column(String)user = relationship('User', back_populates='addresses')__table_args__ = (UniqueConstraint('user_id', 'street', name='unique_user_address'),)class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)addresses = relationship('Address', back_populates='user')# 创建数据库表
Base.metadata.create_all(engine)# 插入用户数据
user1 = User(name='Alice', age=30)
user2 = User(name='Bob', age=25)# 插入地址数据
address1 = Address(street='123 Main St', user=user1)
address3 = Address(street='789 Oak St', user=user2)session.add(user1)
session.add(user2)
session.commit()# 查询所有用户以验证插入操作
users = session.query(User).all()
print('\nquery all users')
for user in users:print(f"ID: {user.id:2} | Name: {user.name:7} | Age: {user.age:4}")# 执行关联查询并输出完整的用户信息
users_with_addresses = session.query(User).options(joinedload(User.addresses)).all()
print(' \n执行关联查询并输出完整的用户信息')
for user in users_with_addresses:user_info = f"User ID: {user.id:3}, Name: {user.name:10}, Age: {user.age:4}"for address in user.addresses:address_info = f",  Street: {address.street}"print(user_info.ljust(40) + address_info)# for user in users_with_addresses:
#     print(f"User ID: {user.id}, Name: {user.name}, Age: {user.age}, Street: {', '.join([address.street for address in user.addresses])}")# for user in users_with_addresses:
#     print(f"User ID: {user.id}, Name: {user.name}, Age: {user.age}")
#     for address in user.addresses:
#         print(f"  Address ID: {address.id}, Street: {address.street}")# 查询重复的用户记录
duplicate_users = (session.query(User).group_by(User.name, User.age).having(func.count(User.id) > 1).all()
)# 删除重复记录,保留第一个记录
for user in duplicate_users:first_user = (session.query(User).filter_by(name=user.name, age=user.age).order_by(User.id).first())session.query(User).filter_by(name=user.name, age=user.age).delete(synchronize_session=False)session.commit()# 查询所有用户以验证删除操作
users = session.query(User).all()
print(' \nquery all users')
for user in users:print(f"ID: {user.id:3} | Name: {user.name:10} | Age: {user.age:4}")# 查询所有的地址
all_addresses = session.query(Address).all()# 获取用户的 ID 列表
user_ids = [user.id for user in session.query(User).all()]# 删除不对应的地址信息
for address in all_addresses:if address.user_id not in user_ids:session.delete(address)
session.commit()# 查询 Address 表以验证删除操作
addresses = session.query(Address).all()
print(' \nquery all addresses')
for address in addresses:print(f"ID: {address.id:2} | Street: {address.street:20} | User ID: {address.user_id}")

相关文章:

PYTHON利用SQLAlchemy库高效操作关联的数据表

SQLAlchemy是一个Python库,用于处理关系型数据库的ORM(对象关系映射)和SQL表达式的生成。它提供了许多功能,包括: ORM(对象关系映射):允许将数据库表映射到Python对象,使…...

TypeScript中的类型工具

类型工具 是ts提供的一些内置的工具,用来更方便地处理各种类型,以及生成新的类型,可以直接使用。也就是对类型的操作。 1. 字符串类型工具 ts 内置了四个字符串类型工具,专门用来操作字符串类型。这四个工具类型都定义在 ts 自…...

File --JAVA

File --JAVA 构造方法 方法说明public File (String pathname)根据文件路径创建对象public File (String parent, String child)根据父路径名字字符串和子路径名字符串创建文件对象public File (String parent, String child)根据父路径对应文件对象和子路径名字符串创建文件…...

比较Excel中的两列目录编号是否一致

使用java代码比较excel中两列是否有包含关系,若有包含关系,核对编号是否一致。 excel数据样例如下: package com.itownet.hg;import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import j…...

pgsql 创建自增ID , 指定自增ID起始值

1. 创建序列: CREATE SEQUENCE table_name_id_seq; 2. 将序列与表的列关联: ALTER TABLE table_name ALTER COLUMN id SET DEFAULT nextval(table_name_id_seq);3. 设置序列的起始值、递增步长和最大值 // 将序列的起始值设置为 1 ALTER SEQUENCE ta…...

数据安全的重要性:如何解密[thekeyishere@cock.li].Elbie勒索病毒

尊敬的读者: 随着数字时代的来临,网络威胁也不断进化,而[datastorecyberfear.com].Elbie勒索病毒是其中的一个引人注目的例子。这个恶意软件采用高度精密的方法,将用户的数据文件锁定,并要求支付赎金以获取解锁密钥。…...

图像识别在自动驾驶汽车中的决策规划与控制策略研究。

图像识别在自动驾驶汽车中的决策规划与控制策略研究 随着自动驾驶技术的不断发展,图像识别已经成为实现自动驾驶的关键技术之一。在自动驾驶汽车中,图像识别技术主要用于环境感知、决策规划和控制系统。本文将重点探讨图像识别在自动驾驶汽车中的决策规…...

Spring MVC 的责任链模式

Spring MVC 框架使用了责任链模式来处理HTTP请求的流程。这个责任链模式主要包括多个拦截器(Interceptor)以及处理器(Handler),它们协同工作以完成请求的处理和响应。以下是Spring MVC的责任链模式的工作原理和流程图&…...

提升用户体验的关键步骤

快速搭建功能齐全的户外帐篷用具小程序,是现今越来越流行的一种商业模式。通过将线下的户外用品店转移到线上,不仅可以减少人力成本和租金等固定支出,还可以为用户提供更便捷的购物体验。因此,学习如何快速搭建一个功能齐全的户外…...

本地模拟,服务器下载文件

题目要求: 编写客户端程序和服务器端程序客户端可以输入一个音乐 文件名,比如 美丽中国,服务端 收到音乐后,可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可客户端收到文件后…...

如何防止Shopee账户关联

在当今数字时代,隐私和安全问题变得日益重要。作为一家受欢迎的在线购物平台,Shopee卖家也面临着多账号关联的风险。本文将如何具保护Shopee免受关联。 一、MuLogin防关联指纹浏览器简介 MuLogin是一款专为隐私保护而设计的指纹浏览器,旨在保…...

Java 入门指南:使用 Docker 创建容器化 Spring Boot 应用程序

文章目录 步骤 1: 准备工作步骤 2: 克隆 Spring Boot 应用程序步骤 3: 创建 Dockerfile步骤 4: 构建 Docker 映像步骤 5: 运行容器步骤 6: 链接到本地数据库步骤 7: 使用 Docker Compose 运行多个容器步骤 8: 设置 CI/CD 管道结论 🎈个人主页:程序员 小侯…...

Leetcode 542. 01 矩阵

542. 01 矩阵-中等 问题描述 给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1: 输入:mat [[0,0,0],[0,1,0],[0…...

分享一下微信小程序抽奖链接怎么做

标题:微信小程序抽奖链接制作全攻略,轻松玩转营销抽奖活动 一、引言 在当今的数字化时代,抽奖活动已经成为一种高效的市场营销策略,而微信小程序作为一个功能强大的移动端平台,为企业和个人提供了制作抽奖链接的便捷…...

MathType2024破解版激活序列号

MathType序列号是一款针对该软件而制作的激活工具,大家都知道这款软件在官方是需要花钱购买的,不然得话就只能试用。有很多功能都无法正常使用!而本序列号却可以完美的解决这一难题,因为它可以破解并激活“MathType”,…...

简述对 Spring MVC 的理解

SpringMVC 是一种基于 Java 语言开发,实现了 Web MVC 设计模式,请求驱动类型的轻量级 Web 框架。 Spring MVC组件 MVC 架构模式的思想,通过把 Model,View,Controller 分离,将 Web 层进行职责解耦&#xff0…...

Redis——哨兵模式与Zookeeper选举的异同点

摘要 当我们使用主从复制出现的问题:手动故障转移:写能力和存储能力受限:主从复制 -master 宕机故障处理。 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干…...

基于 Center 的 3D 目标检测和跟踪

论文地址:https://arxiv.org/abs/2006.11275 论文代码:https://github.com/tianweiy/CenterPoint 3D 目标通常表示为点云中的 3D Boxes。 CenterPoint 在第一阶段,使用关键点检测器检测对象的中心,然后回归到其他属性&#xff0…...

华锐技术何志东:证券核心交易系统分布式改造将迎来规模化落地阶段

近年来,数字化转型成为证券业发展的下一战略高地,根据 2021 年证券业协会专项调查结果显示,71% 的券商将数字化转型列为公司战略任务。 在落地数字化转型战略过程中,证券业核心交易系统面临着不少挑战。构建新一代分布式核心交易…...

数据结构 -- ArrayList与LinkedList的区别

一、二者的相同点 1,它们都是继承自List接口。 二、二者的区别 1,数据结构:ArrayList是(Array动态数组)的数据结构;而LinkedList是(Link双向链表)的数据结构。ArrayList 自由性较…...

Phi-4-mini-reasoning真实案例:教育SaaS平台月均百万次推理调用的稳定性保障

Phi-4-mini-reasoning真实案例:教育SaaS平台月均百万次推理调用的稳定性保障 1. 项目背景与挑战 在教育科技行业,数学和逻辑推理类题目的自动解答一直是技术难点。某头部教育SaaS平台在2023年接入了Phi-4-mini-reasoning模型,用于其在线作业…...

【已验证】STM32采集声音传感器实现环境声实时监测

1. 引言声音传感器模块这玩意一般在什么环境检测类的课设毕设用的比较多,什么工地环境检测,声控灯、噪音监测、安防报警等场景。本文将详细介绍硬件连接、STM32CubeMX配置以及完整的HAL库驱动代码,最终通过串口打印实时噪声值(ADC…...

intv_ai_mk11快速上手:浏览器输入URL→发送‘帮我写周报’→获得带数据亮点的Word格式草稿

intv_ai_mk11快速上手:浏览器输入URL→发送帮我写周报→获得带数据亮点的Word格式草稿 1. 什么是intv_ai_mk11 intv_ai_mk11是一款基于Llama架构的AI对话助手,拥有7B参数规模,运行在GPU服务器上。它能像真人助手一样理解你的需求&#xff0…...

Qwen2.5-7B微调保姆级教程:单卡十分钟快速上手,小白也能搞定

Qwen2.5-7B微调保姆级教程:单卡十分钟快速上手,小白也能搞定 1. 前言:为什么选择Qwen2.5-7B进行微调 大模型微调听起来很高深?其实没那么复杂。今天我要带大家用最简单的方式,在单张显卡上10分钟内完成Qwen2.5-7B模型…...

火影迷的AI绘画神器:忍者绘卷Z-Image Turbo零基础入门实战

火影迷的AI绘画神器:忍者绘卷Z-Image Turbo零基础入门实战 1. 前言:当火影忍者遇上AI绘画 作为一名火影迷,你是否曾经幻想过自己也能创造出独特的忍者世界角色?现在,借助"忍者绘卷Z-Image Turbo"这款专为火…...

为什么选全屋定制,不买成品柜

1)为什么选全屋定制,不买成品柜?​ 成品柜尺寸固定,苏州很多户型飘窗、梁位、管道多,放进去丑、浪费空间!我们定制严丝合缝,顶天立地,收纳多 30%,颜值统一,和…...

VRCT终极指南:3步实现VRChat跨语言实时翻译,打破虚拟社交障碍

VRCT终极指南:3步实现VRChat跨语言实时翻译,打破虚拟社交障碍 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT 您是否曾在VRChat的国际房间中,面对来自…...

全民养虾潮背后:智能体产业的产业化困局

2026年3月,如果你在科技园区看到有人抱着电脑排长队,或者听到“养虾了吗”的问候,不必感到奇怪。这只“虾”正是开源AI智能体——OpenClaw。从社交平台刷屏的“养龙虾”攻略到GitHub星标数突破27万,超越Linux登顶全球开源项目榜首…...

KityMinder云存储与分享功能完整指南:打造高效团队协作体验

KityMinder云存储与分享功能完整指南:打造高效团队协作体验 【免费下载链接】kityminder 百度脑图 项目地址: https://gitcode.com/gh_mirrors/ki/kityminder KityMinder作为百度FEX团队开发的在线思维导图工具,其强大的云存储与分享功能让团队协…...

Conda环境管理全攻略:从零配置到VSCode无缝衔接(附清华镜像加速)

Conda环境管理全攻略:从零配置到VSCode无缝衔接(附清华镜像加速) 在数据科学和机器学习领域,Python环境的配置与管理往往是项目开始的第一步,也是最容易让初学者感到困惑的环节。不同项目可能需要不同版本的Python解释…...