SQLAlchemy映射表结构和对数据的CRUD
目录
ORM模型映射到数据库中
SQLAlchemy对数据的增删改查操作编辑
构建session对象
添加对象
查找对象
修改对象
删除对象
ORM模型映射到数据库中
用declarative_base
根据engine
创建一个ORM基类
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine(DB_URI)
Base = declarative_base(engine)
用这个Base
类作为基类来写自己的ORM类。要定义__tablename__
类属性,来指定这个模型映射到数据库中的表名
class Person(Base):__tablename__ ='t_person'
创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型
class Person(Base):__tablename__ ='t_person'# 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。# 这些属性必须是sqlalchemy给我们提供好的数据类型id = Column(Integer,primary_key=True,autoincrement=True)name = Column(String(50))age = Column(Integer)country = Column(String(50))
使用Base.metadata.create_all()
来将模型映射到数据库中
Base.metadata.create_all()
注意
一旦使用
Base.metadata.create_all()
将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了
SQLAlchemy对数据的增删改查操作
构建session对象
所有和数据库的ORM操作都必须通过一个叫做
session
的会话对象来实现,通过以下代码来获取会话对象
from sqlalchemy.orm import sessionmaker
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
from sqlalchemy.orm import sessionmaker
: 这行代码导入了sessionmaker
,它是用于创建会话(session)的工厂函数。
engine = create_engine(DB_URI)
: 这行代码使用了之前构建的数据库连接字符串(DB_URI
)来创建了一个数据库引擎(engine
)。
Base = declarative_base(engine)
: 这行代码使用了declarative_base
函数来创建了一个基类(Base
)。然而,请注意,在declarative_base
函数中传递了一个参数engine
,这将指定此基类使用的数据库引擎。
session = sessionmaker(engine)()
: 这行代码创建了一个会话(session)对象(session
)。sessionmaker
函数接受一个引擎作为参数,用于创建会话。注意后面的额外的一对括号()
,它们实际上调用了sessionmaker
返回的函数,以创建一个实际的会话对象。
添加对象
def create_data_one():with Session() as session:p1 = Person(name = '春秋',age = 6 , country='北京')session.add(p1)session.commit()def create_data_many():with Session() as session:p2 = Person(name = '吕布',age = 19 , country='北京')p3 = Person(name = '貂蝉',age = 18 , country='北京')session.add_all([p2,p3])session.commit()
create_data_one()
函数:
这个函数使用了一个上下文管理器(
with Session() as session
),它创建了一个会话对象session
。在这个函数中,创建了一个名为
p1
的Person
对象,该对象具有名字、年龄和国家信息。然后将
p1
添加到了会话中 (session.add(p1)
)。最后调用
session.commit()
来提交这个会话,将数据保存到数据库中。
create_data_many()
函数:
同样地,这个函数也使用了上下文管理器来创建一个会话对象
session
。在这个函数中,创建了两个名为
p2
和p3
的Person
对象,分别代表了两个不同的人员信息。使用
session.add_all([p2, p3])
一次性将这两个对象添加到会话中。最后调用
session.commit()
来提交这个会话,将数据保存到数据库中。
查找对象
def query_data_all():with Session() as session:all_person = session.query(Person).all()for p in all_person:print(p.name)def query_data_one():with Session() as session:p1 = session.query(Person).first()print(p1.name)
def query_data_by_params():with Session() as session:# p1 = session.query(Person).filter_by(name='吕布').first()p1 = session.query(Person).filter(Person.name == '吕布').first()print(p1.age)
query_data_all()
函数:
使用上下文管理器创建了一个会话对象
session
。使用
session.query(Person).all()
查询了所有的Person
对象,并将它们以列表的形式返回给变量all_person
。然后通过一个循环遍历了所有的人员,并打印了他们的名字。
query_data_one()
函数:
同样地,使用上下文管理器创建了一个会话对象
session
。使用
session.query(Person).first()
查询了第一个Person
对象,并将其赋给了变量p1
。最后打印了
p1
对象的名字。
query_data_by_params()
函数:
这个函数演示了如何通过特定的条件来查询数据。
使用了上下文管理器创建了一个会话对象
session
。通过
session.query(Person).filter(Person.name == '吕布').first()
查询了名字为 '吕布' 的第一个Person
对象,并将其赋给了变量p1
。最后打印了
p1
对象的年龄。
修改对象
def update_data():with Session() as session:p1 = session.query(Person).filter(Person.name == '吕布').first()p1.age = 20# 提交事务session.commit()
使用上下文管理器创建了一个会话对象
session
。使用
session.query(Person).filter(Person.name == '吕布').first()
查询了名字为 '吕布' 的第一个Person
对象,并将其赋给了变量p1
。将
p1
对象的age
属性更新为20
:p1.age = 20
。最后,通过
session.commit()
提交了事务,将更新保存到数据库中
删除对象
将需要删除的数据从数据库中查找出来,然后使用session.delete
方法将这条数据从session中删除,最后做commit操作就可以了
def delete_data():with Session() as session:p1 = session.query(Person).filter(Person.name == '貂蝉').first()session.delete(p1)session.commit()
使用上下文管理器创建了一个会话对象
session
。使用
session.query(Person).filter(Person.name == '貂蝉').first()
查询了名字为 '貂蝉' 的第一个Person
对象,并将其赋给了变量p1
。使用
session.delete(p1)
删除了p1
对象,即删除了名字为 '貂蝉' 的人员信息。最后,通过
session.commit()
提交了事务,将删除操作保存到数据库中。
相关文章:

SQLAlchemy映射表结构和对数据的CRUD
目录 ORM模型映射到数据库中 SQLAlchemy对数据的增删改查操作编辑 构建session对象 添加对象 查找对象 修改对象 删除对象 ORM模型映射到数据库中 用declarative_base根据engine创建一个ORM基类 from sqlalchemy.ext.declarative import declarative_base engine cr…...

Spring boot原理
起步依赖 Maven的传递依赖 自动配置 Springboot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。 自动配置原理: 方案一…...

技术贴 | 深度解析 PostgreSQL Protocol v3.0(二)— 扩展查询
引言 PostgreSQL 使用基于消息的协议在前端(客户端)和后端(服务器)之间进行通信。该协议通过 TCP/IP 和 Unix 域套接字支持。 《深度解析 PostgreSQL Protocol v3.0》系列技术贴,将带大家深度了解 PostgreSQL Protoc…...

HDFS编程实践-从HDFS中下载指定文件到本地
前言:Hadoop采用java语言开发,提供了Java Api与HDFS进行交互 先要把hadoop的jar包导入到idea中去 为了能编写一个与hdfs交互的java应用程序,一般需要向java工程中添加以下jar包 1)/usr/local/hadoop/share/hadoop/common目录下…...

安防监控视频AI智能分析网关:人流量统计算法的应用场景汇总
TSINGSEE青犀人流量检测算法是内置在智能分析网关中的一种能够通过AI分析和计算人群数量以及密度的算法技术,在提升城市管理效率、改善用户体验和增加安全性方面发挥着重要作用。人流量检测算法在许多领域都有广泛的应用,如智慧城市、智慧交通、智慧景区…...

第一百五十二回 自定义组件综合实例:游戏摇杆三
文章目录 内容回顾优化性能示例代码我们在上一章回中介绍了 如何实现游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在前面章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的整个过程…...

多线程的学习中篇上
终其一生,满是遗憾 知足且坚定,温柔且上进 总之岁月漫长,然而值得等待 获取当前线程引用 方法说明public static Thread currentThread();返回当前线程对象的引用 currentThread() > 在那个线程中, 就能获取到那个线程的实例. static关键…...
非标准化套利
交易对象:目前使用非标准化组合进行交易。(即黄金远近月,焦煤焦炭等等) 交易平台:易盛极星极星产品网 手续费研究:白糖期货手续费和保证金2023年09月更新 - 九期网 本人使用的期货交易公司:中信期货&…...

从CNN(卷积神经网络),又名CAM获取热图
一、说明 卷积神经网络(CNN)令人难以置信。如果你想知道它如何看待世界(图像),有一种方法是可视化它。 这个想法是,我们从最后的密集层中得到权重,然后乘以最终的CNN层。这需要全局平均…...

kafka消费者多线程开发
目录 前言 kafka consumer 设计原理 多线程的方案 参考资料 前言 目前,计算机的硬件条件已经大大改善,即使是在普通的笔记本电脑上,多核都已经是标配了,更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单…...

布局设计和实现:计算器UI【TableLayout、GridLayout】
一、使用TableLayout实现计算器UI 1.新建一个空白项目布局 根据自己的需求输入其他信息 填写完成后,点击Finish即可 2. 设计UI界面 在res/layout文件夹中的XML文件中创建UI界面。在这个XML文件中,您可以使用TableLayout来设计计算器界面。 2.1 创建l…...

stack与queue的简单封装
前言: stack与queue即栈和队列,先进后出/先进先出的特性我们早已了然于心, 在学习数据结构时,我们利用c语言实现栈与队列,从结构体写起,利用数组或指针表示他们的数据成员,之后再一个个实现他们…...
ChatGPT使用技巧整理
目录 1. 让ChatGPT扮演专家角色2. 告诉ChatGPT你的身份3. 限制ChatGPT的回答长度4. 让ChatGPT一步步思考5. 明确你的要求和目的6. 提供充分的背景信息7. 始终结构化思考你的prompt1. 让ChatGPT扮演专家角色 当你们讨论的是市场营销问题时,你可以要求ChatGPT扮演一个具有20年从…...
机器学习笔记 - 维度诅咒的数学表达
1、点之间的距离 kNN分类器假设相似的点也可能有相同的标签。但是,在高维空间中,从概率分布中得出的点往往不会始终靠近在一起。 我们可以用一个简单的例子来说明这一点。 我们将在单位立方体内均匀地随机绘制点(如图所示),并研究该立方体内测试点的 k 个最近邻将占用多少…...
组合计数训练题解
CF40E 题目链接 点击打开链接 题目解法 首先,如果 n , m n,m n,m 一奇一偶,那么答案为 0 0 0 原因是从行和列的角度分析, − 1 -1 −1 个数的奇偶性不同 可以发现 k < max { n , m } k<\max\{n,m\} k<max{n,m} 的性质很微…...
P1095 [NOIP2007 普及组] 守望者的逃离
[NOIP2007 普及组] 守望者的逃离 - 洛谷 首先DP的套路就是先找状态 这题也找不出其他的状态了,只有时间一个 所以用f[i]表示时刻i能走多远 而仔细一想实际上决策只有跑、闪现、停三种决策 然而闪现的耗蓝要和跑步一同计算十分麻烦 于是把它们分开算࿱…...

Python函数绘图与高等代数互融实例(八):箱线图|误差棒图|堆积图
Python函数绘图与高等代数互融实例(一):正弦函数与余弦函数 Python函数绘图与高等代数互融实例(二):闪点函数 Python函数绘图与高等代数互融实例(三):设置X|Y轴|网格线 Python函数绘图与高等代数互融实例(四):设置X|Y轴参考线|参考区域 Python函数绘图与高等代数互融实例(五…...

联想y7000 y7000p 2018/2019 不插电源 不插充电器, 直接关机 ,电量一直89%/87%/86%,V0005如何解决?
这种问题,没有外力破坏的话,电池不可能突然出事。这种一般是联想的固件问题,有可能发生在系统更新,或者突然的不正常关机或长时间电池过热,原因我不是很清楚。 既然发生了,根据我收集的解决方法,…...
stm32与esp8266通信
esp8266 #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h>// 测试HTTP请求用的URL // #define URL "http://162.14.107.118:8086/PC/modifyFoodPrice/0/6"// 测试HTTP请求用的URL // 设置wifi接入信息(请根据您的WiFi信息进行修改) const char…...
组合数 2.1 2.2
O(nlogn)预处理, O(1)查询 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll; typedef long double ld;const int N 1000…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...