关于sqlalchemy的ORM的使用

news2025/4/22 8:42:59

关于sqlalchemy的ORM的使用

  • 二、创建表
  • 三、使用数据表、查询记录
  • 三、批量插入数据
  • 四、关于with...as...:的使用

二、创建表

  1. 使用Mapped来映射字段
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,Mapped,mapped_column

Base = declarative_base()
engine = create_engine('sqlite:///数据库位置')
Session = sessionmaker()

class 类名(Base):
   __tablename__ = '数据库中的表名'
   
   字段名:Mapped[类型] = Mapped_column(限制条件)
   #限制条件有primary_key,unique,nullable.都是布尔类型 
   .....
  1. 使用Annotated定义共同属性字段
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,Mapped,mapped_column
from typing_extensions import Annotated
 
Base = declarative_base()
engine = create_engine('sqlite:///数据库位置')
Session = sessionmaker()
共同属性 = Annotated[类型,mapped_column(限制条件)]
#注解的方式将字段类型定义好了

class 类名(Base):
	__tablename__ = '数据库的的表名'
	字段名:Mapped[共同属性]
	......
	def __repr__(self):
		return f'字段:{self.字段名}'
	#__repr__表示查询返回的值

Base.metadata.create_all(engine)#创建表函数
  1. 获取当前时间函数
from sqlalchemy.sql import func
# func.now()表示获取当前时间
from typing_extensions import Annotated

共同时间属性 = Annontated[datetime.datetime,mapped_column(server_default=func.now())]
#其它与定义表时一样使用
  1. 一对多创建表
#使用id来定义
# 在mapped_column中添加ForeignKey('被关联表名.id').如:
mapped_column(ForeignKey('被关联表名.id'))
关联表字段:Mapped[类型] = mapped_column(ForeignKey('被关联表名.id'))
#整体表传入
被关联表名(小写):Mapped[被关联表名] = relationship(lazy=False | True(默认))
#正向查询
关联表名.被关联表名(小写)#就可以查询被关联表的值
#lazy=False时,关联表和被关联表一起查询
#lazy=True时,只有调用关联表名.被关联表名时才查询
#反向查询
被关联表名(小写):Mapped[被关联表名] = relationship(lazy=False | True(默认),backref='查询被关联表的变量')

双向查询定义(第二种方法)
在被关联表中定义关联关联表
注:List(from typing import List)
关联表字段名:Mapped[List[“关联表名”]] = relationship(back_populates=‘被关联表名字段’)
在关联表中定义关联被关联表
被关联表名(小写):Mapped[被关联表名] = relationship(back_populates=‘关联表名字段’))。如:
在这里插入图片描述

注:可以用session.flush()强行将数据存入数据库。

三、使用数据表、查询记录

  1. 查询一下类
from slqalchemy import select,
query = select(表名).order_by(表名.字段名)
result = session.execute(query)
  1. 查询多个类
from slqalchemy import select
query = select(类名列表).join(类名.外键名)
  1. 查询多个类中的个别字段
query = select(类名.要查询的字段,.....).join_from(类名列表)
#join_from中的类名列表是创建表时就已经关联了
#当两个表中有相同的名称时,就只会用字段_1,字段_2.....,也可以用别名。如下:
query = select(类名.要查询的字段.label('别名'))
#别名的作用是使用数据时能用到
#以上是内连结,内连结的意思是其中一个字段没有关联,就查询不到
query = select(类名.要查询的字段,.....)\
.select_from(outerjoin(类名列表))
#或
query = select(类名.要查询的字段,.....).join(类名.被关联字段,isouter=True)
#以上是外连结,外连结的意思是其中一个字段没有关联,也可以查询到。
  1. where条件
    ==等于,!=不等于,contains包含
#基于对象查询
对象 = session.get(类名,类名的id)
query = select(类名).where(类名.外键名=对象)
# 基于id查询
query = select(类名).where(类名.外键名.id=id)

三、批量插入数据

  1. 没有关联的插入
from sqlalchemy.orm import Session
session = Session(engine)
# 使用insert
session.execute(
	insert(类名).values(数据列表,注数据是字典)
)
session.commit()
  1. 批量关联的插入
from sqlalchemy.orm import Session
with Session(engine) as session:
	session.excute(
		inser(表名).values([
			{
				'字段':value,
				'关联名':select(被关联表名.字段).where(被关联表名.字段=value),
				.....
				},
				.......
		])
	)
#可以通过查询直接属值
  1. 批量更新
from sqlalchemy.orm import Session
with Session(engine) as session:
	session.excute(
		update(表名),[
			{'id':value,字段:value,....},
			......
		]
	)
	session.commit()
  1. 批量删除
from sqlalchemy.orm import Sesseion
with Session(engine) as sesseion:
	session.excute(
		delete(表名).where(条件)
	)
#在条件中查询是否包含相应的值
表名.字段.in_(值列表)

四、关于with…as…:的使用

with…as…:是执行完包含的代码后自动关闭、如果代码有错误会自动跳出。如果有连结或读取代取,代码执行完了后就关闭。

  1. sqlalchemy关于连结数据库的方法
from sqlalchemy.orm import Session
with Session(engin) as session,session.begin():
	........
#session.begin()表示会自动提交事务,所以在with...as ...:中就不用session.commit()代码了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode hot 100 148】排序序列

解法一:(双重循环)第一个循环head,逐步将head的node加入有序列表;第二个循环在有序列表中找到合适的位置,插入node。 /*** Definition for singly-linked list.* public class ListNode {* int val;* …

【Linux】在VMWare中安装Ubuntu操作系统(2025最新_Ubuntu 24.04.2)#VMware安装Ubuntu实战分享#

今天田辛老师为大家带来一篇关于在VMWare虚拟机上安装Ubuntu系统的详细教程。无论是学习、开发还是测试,虚拟机都是一个非常实用的工具,它允许我们在同一台物理机上运行多个操作系统。Ubuntu作为一款开源、免费且用户友好的Linux发行版,深受广…

AutoGen学习笔记系列(十三)Advanced - Logging

这篇文章瞄的是AutoGen官方教学文档 Advanced 章节中的 Logging 篇章,介绍了怎样在使用过程中添加日志信息,其实就是使用了python自带的日志库 logging。 官网链接:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-g…

scrcpy pc机远程 无线 控制android app 查看调试log

背景: 公司的安卓机,是那种大屏幕的连接usb外设的。不好挪动,占地方,不能直接连接pc机上的android stduio来调试。 所以从网上找了一个python adb.exe控制器,可以局域网内远程控制开发的app,并在android stduio上看…

UE5.5 Niagara发射器更新属性

发射器属性 在 Niagara 里,Emitter 负责控制粒子生成的规则和行为。不同的 Emitter 属性决定了如何发射粒子、粒子如何模拟、计算方式等。 发射器 本地空间(Local Space) 控制粒子是否跟随发射器(Emitter)移动。 ✅…

MongoDB备份与还原

备份恢复工具介绍 1)mongoexport/mongoimport 2)mongodump/mongorestore 备份工具区别 mongoexport/mongoimport 导入/导出的是JSON格式或者CSV格式 mongodump/mongorestore 导入/导出的是BSON格式。二进制方式,速度快 1)…

计算机:基于深度学习的Web应用安全漏洞检测与扫描

目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 网络爬虫 1.2 漏洞检测 二、 数据集 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 最后 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,…

Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

部署项目至服务器:响应时间太长,无法访问此页面?

在我们部署项目到服务器上的时候,一顿操作猛如虎,打开页面..... 这里记录一下这种情况是怎么回事。一般就是服务器上的安全组没有放行端口。 因为我是用宝塔进行项目部署的。所以遇到这种情况,要去操作两边(宝塔and服务器所属平台…

【数据结构】List介绍

目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中,List是一个接口,继承自Collection。此时extends意为拓展 Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示&…

vs2022用git插件重置--删除更改(--hard)后恢复删除的内容

1、先到项目工程中打开需要恢复的分支。 2、进入代码管理根目录文件夹。 3、在根目录文件夹点右键,点git bash here 正常情况下如果git目录权限足够,是可以如上图所示显示当前分支和当前目录的。 在git权限不足的情况下会出现如下提示: …

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆,邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible ; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…

【MySQL】用户管理和权限

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】用户管理和权限 发布时间:2025.3.12 隶属专栏:MySQL 目录 引言用户用户信息创建用户语法案例 修改用户密码语法案例 删除用户语法案例 权限权限列表查看和刷新用户的权限给用户授权…

指令微调 (Instruction Tuning) 与 Prompt 工程

引言 预训练语言模型 (PLMs) 在通用语言能力方面展现出强大的潜力。然而,如何有效地引导 PLMs 遵循人类指令, 并输出符合人类意图的响应, 成为释放 PLMs 价值的关键挑战。 指令微调 (Instruction Tuning) 和 Prompt 工程 (Prompt Engineerin…

UE5.5 Niagara 发射器粒子更新模块

Particle State (粒子状态)模块 Particle State 主要用于控制粒子的生存状态,包括死亡、消失、响应事件等。 Particle State Kill Particles When Lifetime Has Elapsed 当粒子的生命周期结束时,销毁这些粒子。 Lifetime &…

机器学习(吴恩达)

一, 机器学习 机器学习定义: 计算机能够在没有明确的编程情况下学习 特征: 特征是描述样本的属性或变量,是模型用来学习和预测的基础。如: 房屋面积, 地理位置 标签: 监督学习中需要预测的目标变量,是模型的输出目标。如: 房屋价格 样本: 如: {面积100㎡…

Django与视图

我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲视图 在web应用的MVC结构中,视图一般包含模板和表单,用来给浏览器生成响应。在实际处理过程当中,视图会根据请求的参数从数据源当中找到数据&#xf…

RabbitMQ从入门到实战-2

文章目录 Java客户端快速入门WorkQueue(多消费)能者多劳配置 交换机fanout交换机案例 Direct交换机Topic交互机 声明队列和交互机(IDEA中)基于Bean声明队列和交换机基于注解声明(推) 消息转换器配置Json消息转换器 业务改造&#…

Mac 配置 Maven JDK

不使用 Homebrew,创建指定版本 JDK 1、官网下载指定版本并安装……省略 2、vi ~/.zshrc 同时要检查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试

前言 当今各种大语言模型百花齐放,为了方便使用者更加自由的使用大模型,将大模型变成如同棒球棍一样每个人都能用,并且顺手方便的工具,本地私有化具有重要意义。 本次测试使用ollama完成模型下载,过程简单快捷。 1、进…