Flask框架七:ORM操作MySQL(一)

2023-10-26

1、ORM基础操作

注意点:
①创建新表时必须写Base.metadata.create_all(),数据库中已存在这张表就可以不写(写了不会报错),代表将创建的(类)表映射到数据库中,如果数据库中已经存在这个表了,则不会改变表结构,如果后续操作有冲突则会报错(比如添加一个表中不存在的字段记录),如果没冲突则会往已存在的表里面做操作
②写入数据库中的流程类似于git,先add在commit,要通过实例sessionmaker在调用它的实例化对象使用,为什么这么用具体看代码注释
③通过实例化创建的类可以添加想要的数据进入内存,通过add将数据添加到数据库,通过commit实现入库的操作
④添加一条数据session.add(stu1)添加多条数据session.add_all([stu1,stu2,…])

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
USERNAME = 'root'
PASSWORD = 'root'
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mytest'
BD_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(BD_URL)
Base = declarative_base(engine)
class Student(Base):
    __tablename__ = 'student' # 固定的写法一定要这么写源码规定的
    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(50),nullable=False)
# Base.metadata.create_all()  
stu = Student(name='wchao')  # 将实例化的对象写入内存
print(stu.name,stu.id)  # 还没写入数据库,所以stu.name获取的到,stu.id获取不到
Session = sessionmaker(bind=engine)# 类的实例化
session = Session()  # 里面有__call__方法可以将实例化对象变成函数去调用
session.add(stu)  # 添加到数据库,但是没有保存,要提交之后才可以保存
session.commit()  # 提交

2、通过ORM实现CRUD

注意:CRUD(增删改查)
①删除数据不要采用物理删除,最好给记录添加is_del字段进行逻辑删除
②回滚结合try except使用,如果有异常则进行回滚,没有直接提交,提交之后的数据是不能进行回滚的
③所有的操作除了查询之外都需要commit

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker


USERNAME = 'root'
PASSWORD = 'root'
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mytest'
BD_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(BD_URL)
Base = declarative_base(engine)
class Article(Base):
    __tablename__ = 'art'
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(50), nullable=False)
    content = Column(String(50))
    author = Column(String(50))

    def __str__(self):  # 查询的时候定义的方法,直接调用类的时候会返回数据,就不用类.属性这样复杂的写了
        return 'Article(id:{},title:{},content:{},author:{})'.format(self.id, self.title, self.content, self.author)


# Base.metadata.create_all()
Session = sessionmaker(bind=engine)
session = Session()

# 增
def add_data():
    article1 = Article(title='python', content='人生苦短,我用python', author='龟叔')
    article2 = Article(title='java', content='人生苦短,我用java', author='家叔')
    article3 = Article(title='c', content='人生苦短,我用c', author='草叔')
    session.add(article1)  # 添加一条数据
    session.add_all([article1, article2, article3])
    session.commit()

# 查
def search_data():
    # data = session.query(Article).all()  # all查询所有,返回的是一个列表对象
    # print(data) # 打印表中的每一条记录的地址
    # for item in data:
    #     print(item)
    #     print(item.title)
    # 下面是两种带有条件的查询写法
    # data = session.query(Article).filter(Article.title=='python').all()
    # print(data[0])
    # data = session.query(Article).filter_by(title='python').all()
    # print(data[0])
    # 查询第一条记录,以及自定义想要查询的是哪一条数据
    data = session.query(Article).first()
    print(data)
    data = session.query(Article).get(4)  # 4是id为4的记录,没有返回None,以主键的值为查询的数
    print(data)

# 改
def update_data():
    data = session.query(Article).first()
    data.author = 'wchao'
    print(data.author)  # wchao
    session.rollback()  # 回滚,类似于撤销操作
    print(data.author)  # 龟叔
    session.commit()  # 提交之后还是龟叔,没有改变数据库中的内容
# 删
def delete_data():  # 最好使用逻辑删除,使用修改默认字段的方式来防止误操作上面的物理删除
    data = session.query(Article).get(1)
    session.delete(data)
    session.commit()

# 主函数入口
if __name__ == '__main__':
    # add_data()
    # search_data()
    # update_data()
    delete_data()

3、sqlalchemy常用的数据类型

想要用什么数据类型就要通过from sqlalchemy import 类型进行导入后才可以使用
Folat :浮点类型,应用场景,钱、身高、体重等只会精确到小数点后面的第4位后面的后面的就四舍五入
DECIMAL(arg1,arg2): 定点类型(总共有多少位,保留几位小数),如果小数位没有给够,后面会补上0
Boolean:布尔传True和False进去数据库中会显示1和0,可以作为逻辑删除的is_del字段
Enum:枚举,性别,数据库中只能保存列举的枚举类型,存没有的就会报错
Date:年月日要传递datetime.date()进去
Time:时分秒要传递datetime.date()进去
DateTime:年月日时分秒要传递datetime.date()进去
String:字符类型,需要指定长度,要和Text区分
Text:文本类型
LONGTEXT:长文本类型,一般用于文本内容,要注意导入方式
视频、图片、音乐一般保存路径
测试方法

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String,Float,DECIMAL
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.dialects.mysql import LONGTEXT

USERNAME = 'root'
PASSWORD = 'root'
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mytest'
BD_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(BD_URL)
Base = declarative_base(engine)
class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(60))
    price = Column(Float)
    price1 = Column(DECIMAL(20,5))
    
Base.metadata.drop_all()  # 删除映射的表才能对修改字段的类型
Base.matedata.create_all()
Session = sessionmaker(bind=engine)
session = Session()
user = User(name='wchao',price=12.23456,price1=10.23145698)
session.add()

4、column常用的参数

default:默认值
nullable:是否为空,nullable=False,不允许为空
primary_key:是否为主键
unique:是否唯一,唯一表示字段里面的内容不可以重复,但是可以为null
autoincrement:是否自增
onupdate:修改记录时自动触发update_time=Column(DateTime,onupdate=datetime.now())
name:该属性在数据库中的字段映射,name=Column(‘字段名’,String(50))

5、query的聚合命令以及使用

①模型对象指定查找这个模型中的所有对象
result = session.query(Article).all()查询出来是一个对象列表
②模型中的属性,可以指定查找模型的几个属性
print(result[0].name)返回出来的就是数据库第一条记录中对应的name字段的值
③聚合函数:要导入func才可以使用,from sqlalchemy import func
func.count:统计行的数量
func.avg:求平均值
func.max:求最大值
func.min:求最小值
func.sum:求和

from sqlalchemy import func
result1 = session.query(func.count(Article.id))
print(result1) # 返回的是原生的sql语句
result2 = session.query(func.count(Article.id)).first()
print(result2) # 返回的是查询的结果,以元组形式返回
result3 = session.query(func.count(Article.id)).filter(Article.title=='python').first()
print(result3) # 可以结合filter使用,注意func传入的位置

6、过滤条件

from sqlalchemy import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
# 查询表中title字段中记录为title0的记录内容,不是的话变==为!=
result = session.query(Article[映射的表对象的名称]).filter(Article.title == 'title0').all
# 模糊查找记录中含有title内容的记录
result = session.query(Article).filter(Article.title.like('%title%')).all()
# in在什么里面 和 notin_(可以写成~)不在什么里面 [1,4]是查1和4,不是1到4
result = session.query(Article).filter(Article.title.in_(['title0','titel2']))
result = session.query(Article).filter(~Article.title.in_(['title0','titel2']))
# is null注意,null是None(没有开辟内存空间),如果数据里什么都不写就是非None(开辟了内存空间)
result = session.query(Article).filter(User.name==None)
result = session.query(Article).filter(User.name.is_(None))
# and
from sqlalchemy import and_  # 只有使用and_才需要导入,其它的写法不用导入
result = session.query(Article).filter(Article.title=='title0',Article.id==0).all()
result = session.query(Article).filter(and_(Article.title=='title0',Article.id==0)).all()
result = session.query(Article).filter(Article.title=='title0').filter(Article.id==0).all()
# or 满足其中的一个条件就可以查询出来
from sqlalchemy import or_
result = session.query(Article).filter(or_(Article.title=='title0',Article.id==0)).all()
for every in result:
	print(every)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask框架七:ORM操作MySQL(一) 的相关文章

  • 64位Ubuntu上编译32位程序操作步骤

    1 确认主机为64位架构的内核 应该输出为adm64 执行 dpkg print architecture2 确认打开了多架构支持功能 应该输出为i386 执行 dpkg print foreign architectures 如果没有 则
  • echo命令

    inux的echo命令 在shell编程中极为常用 在终端下打印变量value的时候也是常常用到的 因此有必要了解下echo的用法 echo命令的功能是在显示器上显示一段文字 一般起到一个提示的作用 该命令的一般格式为 echo n 字符串
  • 激活函数的意义与选择

    激活函数的意义与选择 激活函数的定义 首先 什么是激活函数 activation functions 维基百科上给出的定义是这样的 激活函数即为 对给定输入或输入集定义了相关输出的函数 一个计算机芯片回路即可视为一个激活函数 有on和off
  • python中解释说明符号_python的注释有哪几种

    python的注释有哪几种 下面是方法汇总 一 python单行注释符号 python中单行注释采用 开头 示例 this is a comment 二 批量 多行注释符号 多行注释是用三引号 例如 输入 或者 将要注释的代码插在中间 相关
  • 推荐5款好用的Java软件,初学者必看

    工欲善其事必先利其器 想要学好Java 除了要有好的学习资源之外 还要有一套适合自己的Java软件 好的软件能极大提高你的学习和工作效率 那么 学Java用什么软件好呢 下面小千为大家推荐5款好用的Java软件 1 JDK JDK是Java
  • Unity C++ 底层渲染(low level) plugin

    Unity C 底层渲染 plugin 1 Android Unity Render 1 1 android handle all the process 1 2 unity handle all the process 1 3 andro
  • C#将exe运行程序嵌入到自己的winform窗体中

    以下例子是将Word打开 然后将它嵌入到winform窗体中 效果如下图 注意 该方法只适用于com的exe 如word Excel之类 net的编的exe就不能用这用方法嵌入到窗体中 using System using System C
  • input 输入框频繁请求接口,如何正确的显示最后一次接口返回的数据?

    使用axios的CancelToken中断请求 页面中使用 在需要使用的vue页面中引入 import source from http 之后 在你想要的地方使用
  • 结构体成员的内存分布与对齐

    我们先看一道IBM和微软的笔试题 IBM笔试题 struct short a1 short a2 short a3 A struct long a1 short a2 B sizeof A 6 sizeof B 8 为什么 注 sizeof
  • ubuntu10.04下Eclipse&pydev搭建python环境

    ubuntu10 04下Eclipse pydev搭建python环境 ubuntu10 04已经自带了python 用户可以在命令行中输入python 就启动了python 就可以写程序来测试了 也可以通过用gedit写一些脚本 然后在命
  • 人工智能在医疗领域的应用

    随着科技的不断发展 人工智能 AI 已经渗透到各个领域 在本文中 我们将探讨人工智能在医疗领域的几种重要应用 1 医学影像诊断 近年来 深度学习技术已成功地应用于各种图像识别任务 与此同时 医学影像诊断作为一个重要的医疗环节 也受益于深度学
  • Ubuntu 18.04 如何调整桌面图标大小

    Ubuntu 18 04 与其它版本不一样 调整桌面大小非常不方便 现在介绍一种比较便捷的方法 1 打开任何一个带有图标的文件夹 2 按住 Ctr 同时滚动鼠标滑轮 可以调整该文件夹内的图标 3 桌面图标会同时进行调整
  • Python pow函数

    描述 pow 函数是Python的内置函数 它计算并返回x的y次方的值 语法和参数 pow x y z 名称 备注 说明 x 底数 不可省略的参数 y 指数 不可省略的参数 z 取余数字 可省略的参数 当z存在时 函数返回值等于 pow x
  • Modbus Slave和Modbus Poll的使用说明

    Modbus Slave和Modbus Poll的使用说明 1 软件说明 Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器 用于测试和调试Modbus从设备 软件支持ModbusRTU ASCII T
  • yuv420文件通过C语言分别读取出Y,U,V

    YUV总共有三种格式 YUV444 YUV422 YUV420 YUV 4 4 4 每一个 Y 分量对于一对 UV 分量 每像素占用 Y U V 8 8 8 24bits 3 字节 各采样分量在扫面每个像素点时 都不会降低采样率 YUV 4
  • 网络安全(黑客)自学

    目录 一 自学网络安全学习的误区和陷阱 二 学习网络安全的一些前期准备 三 网络安全学习路线 四 学习资料的推荐 想自学网络安全 黑客技术 首先你得了解什么是网络安全 什么是黑客 网络安全可以基于攻击和防御视角来分类 我们经常听到的 红队

随机推荐

  • Unity获取 鼠标 插值的 几种 方法

    说说思路实现 Unity中获取 鼠标插值的原理是 用上一帧鼠标的位置 减去这一帧的鼠标位置的值 然后要进行对第一次进行判断 判断这一次位置是不是原来的值 如果不是就进行差 运算 得出偏移量 再把上一次的位置的值给这个一次 private V
  • mongodb分片集群的停止

    1 启动shard 和config服务 mongod f mongodb v1 conf shard conf mongod f mongodb v1
  • CSP-S (NOIP提高组) 历年复赛真题考察内容(1999~2020)

    TZOJ题目分类 其中 1 动态规划 18题 其中11题较困难 2 搜索 16题 大部分难题也需要用到搜索 3 贪心 12题 4 模拟 15题 5 二分 8题 6 最短路 5题 7 高精度 4题 8 拓扑排序 4题 9 数论 4题 10 倍
  • 问题:Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?【原创】...

    现象 点 是 Y 提示信息中提到的error242440 02 xml文件 问题重现 package poi import java io FileNotFoundException import java io FileOutputStr
  • p2psear正在连接服务器,P2PSearcher无法连接到网络,也无法连接到服务器

    P2PSearcher可以说是非常有名的搜索器 通常情况下 该软件可以正常使用 如果您无法连接到服务器或Internet软件无法连接服务器 则不必担心 可以参考本文中的说明进行解决 如果P2PSearcher无法连接到服务器怎么办 如果P2
  • ODOO权限管理

    权限等级 第一级是access rule 即表级 对象 权限 控制用户组对某个对象是否有创建 读取 修改 删除的权限 一般是用security ir model access csv文件来管理 第二级是行级权限 控制用户组对表中数据行的访问
  • HIVE窗口函数合集 -- 持续更新

    HIVE窗口函数合集 NTILE 将分组数据按照顺序切片 并返回切片值 RANK 计算跳跃排名 DENSE RANK 计算连续排名 ROW NUMBER 计算行号 LAG 按偏移量取当前行之前第几行的值 LEAD 按偏移量取当前行之后第几行
  • 表格嵌套_vlookup+left函数嵌套如何运用,表格数据查询的另类用法

    今天我们来学习一下vlookup函数的不一样的操作方式 如何利用vlookup left文本提取函数进行数据的另类查询 一 案例说明 如上图所示 我们需要根据人员的手机号码 根据我们统计的运营商号码段来进行判断 确认人员的手机号码属于哪个运
  • Matlab 回归分析与预测

    统计分析 回归分析与预测 数理统计 回归分析 回归分析类型 回归分析目的 一元线性回归 多元线性回归的案例 B BINT R RINT STATS regress Y X B BINT R RINT STATS regress Y X AL
  • Pyrthon闭包操作

    在函数编程中经常用到闭包 闭包是什么 它是怎么产生的及用来解决什么问题呢 给出字面的定义先 闭包是由函数及其相关的引用环境组合而成的实体 即 闭包 函数 引用环境 想想Erlang的外层函数传入一个参数a 内层函数依旧传入一个参数b 内层函
  • 使用Python探索四大名著【红楼梦】人物之间的关系,简直帅呆了

    嗨 大哥们 我来了 红楼梦 作为我国四大名著之一 古典小说的巅峰之作 粉丝量极其庞大 而红学也经久不衰 所以我们今天通过 Python 来捋一下红楼梦里那错综复杂的人物关系 话不多说 开始整活 一 准备工作 红楼梦txt格式电子书一份 金陵
  • 什么是分数阶控制器

    转自他人论文 本博文仅做整理 一 介绍 分数阶微积分是一个古老而又 新鲜 的概念 早在整数阶微积分创立的初期 就有一些学者开始考虑 它的含义 然而 由于缺乏应用背景和计算困难等原因 分数阶微积分理论及应用的研究一直没有得到太 多实质性进展
  • Linux cat命令详解

    cat命令是linux下的一个文本输出命令 通常是用于观看某个文件的内容的 cat主要有三大功能 1 一次显示整个文件 cat filename 2 从键盘创建一个文件 cat gt filename 只能创建新文件 不能编辑已有文件 3
  • IMX6ULL移植篇-uboot网络配置工作

    一 uboot 网络IP配置 1 硬件连接 在使用 uboot 的网络功能之前先用网线将开发板的 ENET2 接口和电脑或者路由器连接 I MX6U ALPHA 开发板有两个网口 ENET1 和 ENET2 一定要连接 ENET2 ENET
  • 机器人基础知识二

    1 四元数 quaternion 可以看作中学时学的复数的扩充 它有三个虚部 形式如下 q w xi yj zk 四元数旋转可以避免万向节锁现象 只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转 方便快捷 在某些实现下比旋转矩阵效率
  • TCP洪水攻击(SYN Flood)的诊断和处理

    1 SYN Flood介绍 前段时间网站被攻击多次 其中最猛烈的就是TCP洪水攻击 即SYN Flood SYN Flood是当前最流行的DoS 拒绝服务攻击 与DDoS 分布式拒绝服务攻击 的方式之一 这是一种利用TCP协议缺陷 发送大量
  • postman 配置统一的ip地址

    1 建立个开发环境 编辑配置一个 base url 地址 2 在请求的地址中直接使用 base url 使用配置的地址 开启方便切换各个环境的地址ip 转载于 https www cnblogs com yangjiming p 93413
  • Windows10下python-pcl的安装步骤说明,亲测ok

    Windows10下python pcl的安装步骤说明 1 环境依赖 2 安装步骤 2 1 安装visual studio 2017 2 2 安装pcl并配置环境变量 2 3 编译python pcl并且导入moudle 2 4 验证安装成
  • 有点牛,10分钟把小程序直接迁移到APP

    大家好 我是北妈 0 没想到现在的APP都已经卷成这样了 最近一个朋友跟我吐槽他最近接手的一个APP项目 说现在的APP都想把自己从工具发展成平台 堆砌了各类形形色色的功能 然后如果APP一有点小问题或者增加一个小功能就需要发版迭代 同时代
  • Flask框架七:ORM操作MySQL(一)

    1 ORM基础操作 注意点 创建新表时必须写Base metadata create all 数据库中已存在这张表就可以不写 写了不会报错 代表将创建的 类 表映射到数据库中 如果数据库中已经存在这个表了 则不会改变表结构 如果后续操作有冲