【Flask框架】——24 创建ROM映射

news2024/11/24 6:46:38

在这里插入图片描述

在这里插入图片描述


创建ROM映射

ORM:Object Relationship Mapping

创建一个类,一个类对应了一个数据库中的一张表,类的数据属性对应了表中的字段名,这个类称为映射类。

根据映射类创建出一个一个的对象,每个对象对应了表中的一条实际的数据。

1.主动创建映射

Class Users(Base):
    name = ''
    age = ''


obj1 = User('zhangsan', 18)
obj2 = User('lisi', 20)

Users表中的内容

idnameage
1zhangsan18
2lisi20

使用Declarative系统映射的类是根据基类定义的,换句话说每个映射类需要继承这个基类。

我们使用declarative_base() 函数可以创建这个基类,如下所示:

# -*- coding: utf-8 -*-
# @File  : db.py
# @author: 北极的三哈
# @email : Flymeawei@163.com
# @Time  : 2022/12/17 0:06
""""""
from sqlalchemy import create_engine, Column, Integer, String, Float, ForeignKey
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('mysql+pymysql://root:root@localhost:3306/flask_db?charset=utf8mb4', echo=True)

# 1.创建基类(所有ORM中的o,对象模型的超级父类
Base = declarative_base(engine)

# 2.定义Python类和表的映射
# 用‘Base’类作为基类来写自己的ORM类
# 要定义`__tablename__`类属性,来指定这个模型映射到数据库中的表名。
"""
class Person(Base):
    __tablename__ = 't_person'
"""


# 3.创建属性性来映射到表中的字段,
# 所有需要映射到表中的属性都应该为Column类型:
class Person(Base):
    __tablename__ = 't_person'
    # 在这个ORM模型中创建一些属性,来跟表中的字段进行 一一 映射。
    # 这些属性必须是sqlalchemy给我们提供好的数据类型
    id = Column(name='id', type_=Integer, primary_key=True, autoincrement=True)
    name = Column(name='name', type_=String(255))
    age = Column(name='age', type_=Integer)
    address = Column(String(255))
    country = Column(String(50))


# 4.使用`Base.metadata.create_all()`来将模型映射到数据库中。
# 5. 一旦使用`Base.metadata.create_all()`将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。
# 删除表
Base.metadata.drop_all()
# 创建表
Base.metadata.create_all()

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

SQLAlchemy常用数据类型

  1. Integer:整形,映射到数据库中是int类型。
  2. Float:浮点类型,映射到数据库中是float类型。他占据的32位。
  3. Double:双精度浮点类型,映射到数据库中是double类型,占据64位 (SQLALCHEMY中没有)。
  4. String:可变字符类型,映射到数据库中是varchar类型.
  5. Boolean:布尔类型,映射到数据库中的是tinyint类型。
  6. DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储钱相关的字段的时候建议大家都
    使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存
    储多少个数字,第二个参数表示小数点后有多少位。
  7. Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来
    作为枚举。
  8. Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用
    datetime.date 来指定。
  9. DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码
    中,可以使用 datetime.datetime 来指定。
  10. Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用
    datetime.time 来创建值。
  11. Text:存储长字符串。一般可以存储6W多个字符。如果超出了这个范围,可以使用LONGTEXT类型。映射到数据库中就是text类型。
  12. LONGTEXT:长文本类型,映射到数据库中是longtext类型。

注意:这个类型属于Mysql方言里面的

# 定义一个枚举类
class TagEnum(enum.Enum):
    python = "PYHTON"
    flask = "FLASK"
    django = "DJANGO"


# 创建一个ORM模型 说明基于sqlalchemy 映射到mysql数据库的常用字段类型有哪些?
class News(Base):
    __tablename__ = 'news'
    id = Column(Integer, primary_key=True, autoincrement=True)
    price1 = Column(Float)  # 存储数据时存在精度丢失问题
    price2 = Column(DECIMAL(10, 4))
    title = Column(String(50))
    is_delete = Column(Boolean)
    tag1 = Column(Enum('PYTHON', 'FLASK', 'DJANGO'))  # 枚举常规写法
    tag2 = Column(Enum(TagEnum))  # 枚举另一种写法
    create_time1 = Column(Date)
    create_time2 = Column(DateTime)
    create_time3 = Column(Time)
    content1 = Column(Text)
    content2 = Column(LONGTEXT)


# 使用`Base.metadata.create_all()`来将模型映射到数据库中。
Base.metadata.drop_all()
Base.metadata.create_all()

# 新增数据到表news中
a1 = News(price1=1000.0078, price2=1000.0078, title='测试数据',
          is_delete=True, tag1="PYTHON", tag2=TagEnum.flask,
          create_time1=date(2018, 12, 12),
          create_time2=datetime(2019, 2, 20, 12, 12, 30),
          create_time3=time(hour=11, minute=12, second=13),
          content1="hello", content2="hello hi nihao")

在这里插入图片描述

Column常用参数

  1. primary_key:True设置某个字段为主键。
  2. autoincrement:True设置这个字段为自动增长的。
  3. default:设置某个字段的默认值。在发表时间这些字段上面经常用。
  4. nullable:指定某个字段是否为空。默认值是True,就是可以为空。
  5. unique:指定某个字段的值是否唯一。默认是False。
  6. onupdate:在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值。常用于是 update_time 字段(每次更新数据的时候都要更新该字段值)。
  7. name:指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。如果指定了,就会使用指定的这个值作为表字段名。这个参数也可以当作位置参数,在第1个参数来指定。

案例:

class News(Base):
    __tablename__='news'
    id = Column(Integer,primary_key=True,autoincrement=True)
    price1 = Column(Float) #存储数据时存在精度丢失问题
    price2 = Column(DECIMAL(10,4))
    title = Column(String(50))
    is_delete =Column(Boolean)
    tag1 =Column(Enum('PYTHON','FLASK','DJANGO')) #枚举常规写法

2.自动从数据库中映射

# -*- coding: utf-8 -*-

"""
@file: 自动创建OPM映射.py
@author: 北极的三哈
@time: 2022/12/22 20:30
@software: PyCharm2022.3
"""
from sqlalchemy import *
from sqlalchemy.ext.automap import automap_base

# 创建数据库引擎
engine = create_engine('mysql+pymysql://root:root@localhost:3306/flask_db?charset=utf8mb4', echo=True)

# 自动映射
Base = automap_base()
Base.prepare(engine)

# 获取所有表的映射
# 注意:自动映射的表名和类名一样
tables = Base.classes.keys()
print(tables)

# 可重新定义类名
Person = Base.classes.t_person

# 得到桑倩类中所有的属性
keys = Person.__table__.columns.keys()
print(keys)

在这里插入图片描述

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

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

相关文章

函数(6)

目录 1、函数是什么? 2、C语言中函数的分类: 1、库函数 2、自定义函数 3、函数的参数 4、函数的调用 5、练习 1、打印100~200之间的素数 2、打印100~200之间的闰年 3、写一个函数,实现一个整形有序数组的二分查找 6、函数的嵌套调…

CSDN每日一练求最小元素 C语言

题目名称:求最小元素 时间限制:1000ms内存限制:256M 题目描述 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]). Find the minimum…

MS17-010漏洞攻击与防御(利用永恒之蓝攻击Win7系统)

任务1 利用永恒之蓝攻击Win7系统 在Kali终端中输入命令“msfconsole ”,启动Metasploit;输入命令“use auxiliary/scanner/smb/smb_ms17_010”,加载扫描模块;输入命令“set RHOSTS 192.168.0.6”,设置需要被扫描的目标…

哈希表题目:环形链表 II

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法证明代码复杂度分析题目 标题和出处 标题:环形链表 II 出处:142. 环形链表 II 难度 2 级 题目描述 要求 给你一个链表的头结点 head\tex…

CSDN周赛第16期-100分满分题解

前言 这是时隔两年再参加比赛了,上次参加算法竞赛还是2020年在公司1024活动的时候。当时获得了二等奖(switch套装)和一个快题奖(小米行李箱)。 这次比赛获得了满分,也还不错。题目除了二维积水的问题&…

8Manage:提高项目执行力的策略有哪些?

在项目管理中实施执行战略,将战略目标转化为商业价值的企业将发现取得成功所涉及的大团队——最高管理层、中层管理人员、项目经理和项目团队。 以下是阻碍项目成功执行的六个主要差距: ● 缺少共同的理解 ● 缺乏参与的执行赞助者 ● 与战略目标不一致…

计算机网络—Nginx概述

文章目录nginx负载均衡:例:安装配置nginx————————————————————————————————nginx负载均衡: 请求会打到nginx上面,nginx可以用作负载均衡, 例:一个网站用一台服务器不够&a…

001 软件安装与配置

1、Anaconda安装及使用 1.1 下载地址 Anaconda3-2022.10-Windows-x86_64 1.2 Anaconda创建虚拟环境 下面均在Anaconda终端中输入 查看python版本 python --version1.2.1、Anaconda创建虚拟环境 conda create -n pytorch python3.9conda create 创建虚拟环境命令 -n pytor…

解决vue代码不规范而出现的问题:Eslint修复

当我们刚创建一个vue项目,写代码时候,因为代码写的不规范会出很多问题,报很多错误,除了一个一个去修改他们,还有没有其他办法去解决他们呢? 这里介绍三种办法去统一解决: 方法一:每…

MCU-51:让LED闪烁起来

目录一、LED闪烁1.1 编写代码1.2 延时函数1.3 由0和1控制实现二、LED流水灯2.1 流水灯基础版2.2 移位法实现LED流水灯一、LED闪烁 昨天我们初识单片机,点亮了一个灯开启了我们51单片机的学习之旅。那么今天我们来一步步深入学习。 1.1 编写代码 会了点亮一个灯&a…

嵌入式分享~IO相关1 ##

这里仅总结一下IO控制相关 单片机IO直接驱动继电器 上图是随便找到的两个不同型号的继电器。继电器就是个开关,这个开关是由它内部的线圈控制的,给线圈通电,继电器就吸合,开关就动作了。绝大部分的继电器反面都会有如下图一样的…

win10 git 标准化commit工具commitizen安装教程

1、 安装nodjs https://nodejs.org/en/ 下载最新版本 安装完成后,修改环境变量 默认 nodejs是有的,需要自己添加npm路径 2、安装commitizen 在桌面上右键打开power shell 查看node 和npm的版本,npm最好升级一下 升级命令问题 npm inst…

【HDR】曝光融合(Exposure Fusion)

文章目录0 前言1 算法细节1.1 Naive1.1.1 主要思想1.1.2 权重计算1.1.3 融合1.2 Multi-resolution2 实验3 参考0 前言 在曝光融合(Exposure Fusion)算法问世之前,多曝光序列合成用于显示的HDR需要两个步骤,第一步是将多张不同曝光…

MySql加密存储的数据,如何模糊搜索?

背景 蔚来被勒索 225 万美元,大量数据遭泄露! 根据网络上流传的截图显示,黑客似乎掌握着蔚来内部员工数据 22800 条、车主用户身份证数据 399000 条、用户地址数据 6500000 条、注册用户数据 4850000 条、企业及企业代表联系人数据 10000 条…

dpdk编译

ubuntu网卡信息配置 虚拟机中除去最开始的一块网卡,再另外添加两块网卡,如下图所示 修改Ubuntu20_x64.vmx里面的配置信息 将ethernet0.virtualDev "e1000"里面的e1000更改成vmxnet3,因为e1000只支持网卡单队列,vmxnet3支持网卡对…

5G无线技术基础自学系列 | 5G移动性KPI

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G移动类KPI用来评估NR网络的移动性能&…

29. 如何通过 ABAP 代码给 SAP OData 元数据增添注解

笔者的这篇 SAP UI5 开发教程文章,* SAP UI5 应用开发教程之一百二十九 - 如何给 SAP UI5 SmartField 添加 Value Help 功能,有朋友留言: 你好,请教一个问题,请问如何在odata里面通过annotations添加一个自定义注解&am…

2022年哪些工具适合设计企业产品手册?

产品手册是什么? 产品手册是因特网发展的成果,是一种以移动端为基础进行在线营销的新内容,其中包含了对原有的纸质商品、小册子、促销软文、邀请函等现有促销资料进行数字化的更新。 产品手册是从传统的纸质公司样本书中升级而来的&#xf…

Git 入门

文章目录0. 前言学习目标参考教程链接1. Git概念1.1 什么是Git1.2 Git 的下载1.3 Git三大区域1.4 远程仓库2. Git的使用2.1 图形化操作2.1.1 IDEA图形化操作2.1.2 GitKraken(可选)2.2 命令行操作2.2.1 Git 配置2.2.2 分支命令2.2.3 拉取与推送3. 总结0. 前言 学习目标 了解 G…

面试官:你来说一下Spring IOC容器的创建过程

这篇文章主要讲解 IOC 容器的创建过程,让你对整体有一个全局的认识,文章没有复杂嵌套的 debug 流程,相对来说比较简单。 不 BB,上文章目录。 1. 基础知识 1.1 什么是 Spring IOC ? IOC 不是一种技术,只是…