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…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
