[Flask]数据库的连接和操作

news2024/10/6 20:37:33

一、安装连接程序

        在控制台中使用语句 pip install pymysql 即可安装

        同时为了使用ORM对数据库进行操作(而非sql语句),还需要安装SQLAlchemy

pip install flask-sqlalchemy

二、使用Navicat管理数据库

         安装Navicat软件,本体需要收费,可自行搜索DLC,这里就不展示了。

navivathttp://www.navicat.com.cn/        安装并装载DLC后,按如下步骤进行连接

         连接服务器后选择服务器,按下右键找到新建数据库进行数据库的创建

         编码方式选择utf8mb4(utf8的增强版)

三、连接mysql服务器

        导入SqlAlchemy包依赖

from flask_sqlalchemy import SQLAlchemy

        构建sql对象,需要导入app对象(链接参数在app.config中)

HostName="127.0.0.1"
Port = 3306                     #默认为3306,需要自行修改
UserName="root"                 #默认用户名
Password="admin"
DataBase="database_learn"

app.config['SQLALCHEMY_DATABASE_URI']=f"mysql+pymysql://{UserName}:{Password}@{HostName}:{Port}/{DataBase}?charset=utf8mb4"

db = SQLAlchemy(app)            #创建db对象
#----测试连接是否成功----#
with app.app_context():         #解决上下文问题
    with db.engine.connect() as conn:
        rs = conn.execute("select 1")
        print(rs.fetchone())

四、ORM模型和表的映射

        一个数据模型与数据库中的一张表对应,这里以创建一个User数据表为例:

class User(db.Model):
    __tablename__="user"                    #表名
    id = db.Column(db.Integer,primary_key=True,autoincrement=True) #主键-- autoincrement为序号自动增长
    username = db.Column(db.String(100),nullable=False)             #不能为空
    password = db.Column(db.String(100),nullable=False)

        然后可以使用db.create_all()将其同步到数据库中

with app.app_context():
    db.create_all()

五、ORM模型与增删改查

        ①添加数据

        需要执行以下两步:1.将数据添加到session中;2.commit数据

@app.route('/user/add')
def add_user():
    user = User(username="张三",password='123123')
    db.session.add(user)
    db.session.commit()
    return "创建成功"

        ②查询数据

        有两种查询方法:get查询和filter_by查询,区别在于

                get是根据主键查询单个对象,需要知道主键(id)

                filter_by会根据查询条件返回所有符合要求的对象(需要进行遍历处理)

@app.route('/user/query')
def query_user():
    # 1-get查找(仅根据主键查找--单个查找)
    user = User.query.get(1)
    print(f"{user.id}:{user.username}:{user.password}")
    # 2-filter_by查找(查找所有符合条件的数据)
    users = User.query.filter_by(username='张三')
    for user in users:      #返回结果为列表,需要进行遍历
        print(f"{user.id}:{user.username}:{user.password}")
    return "查找成功"

                此外,还可以使用以下代码(虽然应该用得不多)

User.query.all()    #查找所有数据
User.query.first()  #查找第一个数据
User.query.order_by()    #按照指定字段排序
User.query.group_by()    #按照指定字段分组
User.query.ofsset(x)    #跳过前x条数据
User.query.limit(x)    #对结果数量进行限制
User.query.slice(start,stop)    #对结果进行切片

        ③修改数据

@app.route('/user/update')
def update_user():
    user = User.query.filter_by(username='张三').first()
    user.password='123456'
    db.session.commit() #同步数据
    return "修改成功"

#多对象修改
    users = User.query.filter_by(username='张三')
    for user in users:      #返回结果为列表,需要进行遍历
        user.password='456456'

        ④删除数据

@app.route('/user/delete')
def delete_user():
    user = User.query.get(1)
    db.session.delete(user)
    db.session.commit()
    return "删除成功"

六、ORM表关系的实现(外键)

        ①构建外键关系

        在ORM模型中,外键通过db.ForeignKey实现

#----外键实现----#
class Article(db.Model):
    __tablename__="article"                    #表名
    id = db.Column(db.Integer,primary_key=True,autoincrement=True) #主键-- autoincrement为序号自动增长
    title = db.Column(db.String(200),nullable=False)
    content = db.Column(db.Text,nullable=False)

    #----外键--作者
    author_id = db.Column(db.Interge,db.ForeignKey("user.id"))

        其次,可以通过db.relationship建立联系使得ORM能直接访问外键

    author = db.relationship('User',backref="articles")
     #自动寻找对应的外键表(包含反向引用)

        这里需要注意的是,引用的时候与类名匹配而不是与表名匹配。反向引用则要填写你想要的参数,在主类中使用该参数进行访问

        ②对外键表进行添加

@app.route('/user/add_book')
def add_book():
    article1 = Article(title="名字不够长还好意思叫轻小说?",content="????")
    article2 = Article(title="名字不够长还好意思叫轻小说?",content="????")
    article.author= User.query.get(2)   #绑定外键
    db.session.add_all([article1,article2])
    db.session.commit()
    return "创建成功"

        ③查找外键表

@app.route('/user/find_book')
def find_book():
    user = User.query.get(2)
    for article in user.articles:    #反向应用的外键类名
        print(article.title)
    return "查找成功"

七、使用ORM更改数据库结构

        需要额外安装flask-migrate插件

pip install flask-migrate

        添加引用

from flask_migrate import Migrate

        创建Migrate对象

migrate = Migrate(app,db)

        使用此方法会将程序中的ORM模型迁移到数据库中(自动识别更改),所有操作均在控制台下执行,一般分为以下三步:

                1.初始化(生成迁移配置文件)

flask db init

                2.生成迁移脚本

flask db migrate

                3.迁移数据

flask db upgrade

        执行完成后会额外生成一个数据表(用于记录迁移脚本的版本号,不需要人为操作)

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

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

相关文章

软件企业认证的条件是什么?

一、双软认证企业的认证标准: 1.企业法人是在我国的境内设立的企业法人; 2.企业计算机的软件开发和生产制造、系统集成、应用服务和其他有关技术服务为其经营业务及主要营业收入; 3.有一种以上由本企业开发或是由本企业具备知识产权的软件产品,或给…

绪论

🙌作者简介:数学与计算机科学学院出身、在职高校高等数学专任教师,分享学习经验、生活、 努力成为像代码一样有逻辑的人! 🌙个人主页:阿芒的主页 ⭐ 高等数学专栏介绍:本专栏系统地梳理高等数学…

网络交换的技术

文章目录1、背景2、电路交换2.1、电路交换的特点2.2、电路交换的缺点3、分组交换3.1、分组交换的主要特点3.2、分组交换的传输单元3.3、分组交换的优点3.4、分组交换的缺点4、报文交换5、三种报文的区别1、背景 网络交换技术共经历了四个发展阶段: 电路交换技术(19世纪末)报文…

带你学懂数据结构中的八大排序(上)

✨个人主页: Yohifo 🎉所属专栏: 数据结构 | C语言 🎊每篇一句: 图片来源 Every challenge, every adversity, contains within it the seeds of opportunity and growth. 每个挑战,每次逆境,里…

山外山在科创板上市:市值约47亿元,高光勇为实际控制人

12月26日,重庆山外山血液净化技术股份有限公司(下称“山外山”,SH:688410)在上海证券交易所科创板上市。本次上市,山外山的发行价格为32.30元/股,发行市盈率为297.74倍。 据贝多财经了解,山外山…

vivo 低代码平台【后羿】的探索与实践

作者:vivo 互联网前端团队- Wang Ning 本文根据王宁老师在“2022 vivo开发者大会"现场演讲内容整理而成。公众号回复【2022 VDC】获取互联网技术分会场议题相关资料。 本文主要从前后端分离的低代码方案、自研高性能渲染引擎、高效的可视化配置方案、千亿级内容…

基于yolov5s实践国际象棋目标检测模型开发

在我前面的一篇文章中讲解实现了基于改进的yolov5s-spd模型实现了五子棋目标对象检测模型系统的设计开发,这里紧接前文,突发奇想,是否可以借鉴同样的思路实现象棋的检测模型开发呢?理论上面肯定是可以的,但是实际效果如…

FineReport企业报表-配置MySQL8外接数据库(2)

1. 配置外接数据库 1.1 外接数据库配置入口 外接数据库的配置入口,有三种形式: 1)超级管理员第一次登录数据决策系统时,即可为系统配置外接数据库。如下图所示: 2)对于使用内置数据库的系统,管…

burpsuite——身份验证

文章目录通过不同响应枚举用户名2FA 简单旁路密码重置破坏逻辑通过细微不同的响应枚举用户名通过响应计时的用户名枚举破解暴力保护,IP 封锁通过帐户锁定的用户名枚举2FA 破坏逻辑暴力破解保持登录状态的 cookie通过不同响应枚举用户名 就是所谓的暴力破解&#xff…

如何将高程数据转成南方CASS的DAT格式

需要的工具 BIGEMPA GIS Office 下载地址:http://download.bigemap.com/bmsetup.rar 第一步:将下载好的高程数据DEM直接拖到global mapper中(如何下载高程DEM?),如下图所示: 第二步:将DEM数据保存为高程点…

A - No Majority(DP 动态规划)[AtCoder Grand Contest 060]

题目如下: 思路 or 题解: 对于一个子串, 如果长度为 lenlenlen, 如果该子串中任意一个字符的出现个数 大于 len2\frac{len}{2}2len​ 那该字符串为 UngoodUngoodUngood 串 反之,如果任意子串, 长度设为 lenlenlen, 如…

Map接口-HashMap、Hashtable和Properties

1.Map 接口和常用方法 1.1Map 接口实现类的特点 [很实用] 注意:这里讲的是JDK8的Map接口特点 1)Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value。 Map 中的key 和 value可以是任何引用类型的数据,会封装到HashMap$Node对象中。(Node…

公网远程连接内网MySQL数据库【内网穿透】

作为网站运行必备组件之一的数据库,免不了随时对其进行管理维护。若我们没有在安装数据库的电脑旁,但又需要立即对数据库进行管理时,应该如何处理?这时我们可以使用cpolar对内网进行穿透,远程管理和操作MySQL数据库。现…

javaee之spring3

模拟一个银行转账事务 先来看一下基础文件 先来看这个spring中的bean.xml配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XML…

Dragonfly 和 Nydus Mirror 模式集成实践

文&#xff5c;戚文博 &#xff08;花名&#xff1a;百蓦&#xff09; Dragonfly Maintainer蚂蚁集团软件工程师 主要负责「基于 P2P 的文件以及镜像加速系统」。 本文 2175 字 阅读 15 分钟 PART. 1 背景 自 17 年开源以来&#xff0c;Dragonfly 被许多大规模互联网公司选…

C++贪吃蛇游戏开发实践

C贪吃蛇游戏开发实践 对象分析 我们首先需要确定一个像素点组成的地图&#xff08;画布&#xff09;&#xff0c;要确定行数、列数和像素点大小。这个地图上将会有两个对象&#xff1a;蛇和食物。 蛇由头和身子组成&#xff0c;他们都有自己的位置&#xff0c;所以考虑使用位置…

移动端测试必备技能: adb命令和抓包

移动端测试 是指对移动应用进行的测试&#xff0c;即实体的特性满足需求的程度&#xff0c;进行测试前需要搭建测试环境。 1 移动端自动化环境搭建 1.1 java安装 java JDK 安装jdk-8u181-windows-x64.exe 配置环境变量&#xff1a; JAVA_HOME&#xff1a;D:\developer to…

基于C#+SqlServer开发(WinForm)学生宿舍管理系统【100010056】

学生宿舍管理系统 一、前言 学生宿合是学生们最为熟悉的领域&#xff0c;假定学校有若干栋宿会楼&#xff0c;每栋宿合楼有若干层&#xff0c;每层有若干个寝室&#xff0c;每个寝室可住若干个学生。以往的手工操作已经不能适应现在办公的需要.为了摆脱繁琐的劳动,提高工作效…

HTML XHTML HTML5区别

文章目录HTML & XHTML & HTML5区别HTMLXHTMLHTML5区别HTML & XHTML & HTML5区别 HTML HTML&#xff0c;全称“HyperText Mark-up Language&#xff08;超文本标记语言&#xff09;”&#xff0c;它是构成网页文档的主要语言。我们常说的HTML&#xff0c;指的…

金融服务机构提高移动应用程序安全性的 3 种方式

金融移动应用程序的使用正在迅速加速&#xff0c; 2020 年用户会话数量增长了 49% 。VMware报告称&#xff0c;金融应用程序的网络攻击在同年也增长了 118%。 Intertrust的另一份报告显示&#xff0c;77% 的金融服务应用程序至少包含一个可能导致数据泄露的安全漏洞。最近发现…