五、Flask学习之MySQL

五、Flask学习之MySQL

1. 下载MySQL

下载教程:MySQL安装及可视化工具SQLyog下载

2.常用指令

2.1. 查看已有数据库

show databases;

在这里插入图片描述

2.2. 创建数据库

create database 名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

在这里插入图片描述

2.3. 删除数据库

drop database 名字;

在这里插入图片描述

2.4. 进入数据库

USE 名字;

在这里插入图片描述

2.5. 查看当前数据库下所有数据

show tables;

在这里插入图片描述

2.6. 创建数据表

数据表类似于Excel表格,有列名和类型

create table 表名(列名称 类型,列名称 类型,列名称 类型
)default charset=utf8;

假设我要创建的表格为:

idNameage

那么就使用下面的代码:

create table info1(id int,name varchar(16),age int
)default charset=utf8;

在这里插入图片描述

然后运行show tables就能看到是否创建成功数据表了。

如果要求输入数据时某一列不能为空,那么就需要使用not null

create table info1(id int not null, -- 不能为空name varchar(16), -- 默认是可以为空的age int
)default charset=utf8;

也可以给某一列设置默认值,如果没有传入值,就使用默认值,如果传入值就使用传入的值

create table info1(id int, name varchar(16),age int default 3 -- 设置默认值为3
)default charset=utf8;

也可以在创建表的时候设置主键:主键不允许重复

id int primary key, 

或者直接按照序号1.2.3…,内部维护:

id int auto_increament primary key, 

2.7. 删除数据表

删除数据表使用:

drop table 数据表名字;

在这里插入图片描述

2.8. 查看表结构

desc 表名称;
mysql> desc info1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(16) | YES  |     | NULL    |                |
| age   | int(11)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

2.9. 添加数据

insert into 表名(列名1,列名2) values(数据1,数据2);
insert into 表名(列名1,列名2) values(数据1,数据2),(数据3,数据4); -- 批量添加
mysql> insert into info1(name,age) values("panda",20);
Query OK, 1 row affected (0.02 sec)mysql> insert into info1(name,age) values("panda01",21),("panda02",22);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

2.10. 查看表

select * from 表名;
mysql> select * from info1;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | panda   |   20 |
|  2 | panda01 |   21 |
|  3 | panda02 |   22 |
+----+---------+------+
3 rows in set (0.00 sec)

3.常用数据类型

3.1. 整数

tinyint:用来存储比较小的整数
有符号范围:-128~127(默认)
无符号范围:0-255

int:用来存储一般的整数
有符号范围:-231~231-1(默认)
无符号范围:0-232-1

bigint:用来存储比较大的整数
有符号范围:-263~263-1(默认)
无符号范围:0-264-1

3.2. 小数

floatdouble用于存储小数,但是不精准,所以存储小数的时候一般用的是decimal

create table info2(id int not null primary key auto_increment,salary decimal(m,n) -- m是指传入数据的最大位数,n是指保留小数的位数,我这里假设m=3,n=2
)default charset=uft8;insert into info2(salary) values(3.14); -- 没问题,不报错
insert into info2(salary) values(3.146); -- 超过设置的小数位数会四舍五入
insert into info2(salary) values(323.14); -- 有问题,会报错,超过最大位数了

3.3. 字符串

  • char

    定长字符串,例如char(6)是指固定用6位来存储,如果输入的位数小于6位,也会按照六位去存储;

  • varchar

    变长字符串,例如varchar(6)是指按照传入多少位就存储多少位的规则,但是不能超过括号里的数(6);

  • text

    用于保存长文本,最多保存216-1个字符;

  • mediumtext

    最多保存224-1个字符;

  • longtext

    最多保存232-1个字符;

3.4. 时间

  • datetime:比较精准,年月日时分秒
  • date:只有年月日

4.数据表的增删改查

4.1. 增

insert into 表名(列名1,列名2) values(数据1,数据2);
insert into 表名(列名1,列名2) values(数据1,数据2),(数据3,数据4); -- 批量添加

创建一个表格:

create table info2(id int not null primary key auto_increment,name varchar(16),birth date,grade decimal(5,2)
);

插入数据:

insert into info2(name,birth,grade) values("小明","2002-3-2",98.66);
insert into info2(name,birth,grade) values("小赵","2003-4-1",99.99);
insert into info2(name,birth,grade) values("小张","2004-5-7",89.34);
insert into info2(name,birth,grade) values("小秦","2003-6-6",96.7);
insert into info2(name,birth,grade) values("大白","2002-4-15",95.9);

执行命令:

select * from info2;

效果:

mysql> select * from info2;
+----+------+------------+-------+
| id | name | birth      | grade |
+----+------+------------+-------+
|  1 | 小明 | 2002-03-02 | 98.66 |
|  2 | 小赵 | 2003-04-01 | 99.99 |
|  3 | 小张 | 2004-05-07 | 89.34 |
|  4 | 小秦 | 2003-06-06 | 96.70 |
|  5 | 大白 | 2002-04-15 | 95.90 |
+----+------+------------+-------+
5 rows in set (0.01 sec)

4.2. 删

delete from info2; -- 删除数据表info2中所有数据
delete from info2 where id=1; -- 删除数据表info2中id=1的数据
delete from info2 where id<3; -- 删除数据表info2中id<3的数据
-- 删除数据表info2中name="小明" 并且grade=98.66的数据
delete from info2 where name="小明" and grade=98.66; 

4.3. 改

update info2 set grade=100; -- 修改数据表info2中列grade的数据为100
update info2 set grade=100 where 条件; -- 修改数据表info2中满足条件的列grade的数据为100

4.4. 查

select * from 表名称;-- 查询数据表中所有的数据
select 列名,列名 from 表名称;-- 查询数据表中特定列名的数据
select 列名,列名 from 表名称 where 条件;-- 查询数据表中符合条件的特定列名的数据

5.使用Python语句操作数据库

5.1. 创建数据

创建数据库:

create database demo DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
use demo;

创建数据表:

create table info(id int not null primary key auto_increment,name varchar(16) not null,passwd varchar(64) not null,mobile char(11) not null
)default charset=utf8;

5.2. 使用python连接数据库

使用命令下载相关模块:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql==1.0.2
import pymysql# 1.连接mysql
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", charset="utf8", passwd="123456", db="demo") # 这里的passwd和db要换成你自己密码和数据库
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

5.3. 添加数据

# 2.发送指令
cursor.execute("insert into info(name,passwd,mobile) values('panda','123465','12345678911') ")
conn.commit()  # 提交指令

如果使用Pycharm可能会标红显示错误,不用管,直接运行即可

检查数据表是否添加上了:

mysql> select * from info;
+----+-------+--------+-------------+
| id | name  | passwd | mobile      |
+----+-------+--------+-------------+
|  1 | panda | 123465 | 12345678911 |
+----+-------+--------+-------------+
1 row in set (0.00 sec)

格式化输入

上面的形式是比较死板的,如果你想使用格式化字符串的方法,不能使用Python自己的方法,而是要使用pymysql自带:

列表形式:

# 列表形式
sql = "insert into info(name, passwd, mobile) values(%s, %s, %s)"
my_list = ["小明", "qwe789", "11111111111"]
cursor.execute(sql, my_list)
conn.commit()  # 提交指令

数据已添加上:

mysql> select * from info;
+----+-------+--------+-------------+
| id | name  | passwd | mobile      |
+----+-------+--------+-------------+
|  1 | panda | 123465 | 12345678911 |
|  2 | 小明  | qwe789 | 11111111111 |
+----+-------+--------+----

字典形式:

# 字典形式
sql = "insert into info(name, passwd, mobile) values(%(name)s, %(passwd)s, %(mobile)s)"
data = {"name": "小李", "passwd": "pythonmysql", "mobile": "22222222222"}
cursor.execute(sql, data)
conn.commit()  # 提交指令

数据已添加上:

mysql> select * from info;
+----+-------+-------------+-------------+
| id | name  | passwd      | mobile      |
+----+-------+-------------+-------------+
|  1 | panda | 123465      | 12345678911 |
|  2 | 小明  | qwe789      | 11111111111 |
|  3 | 小李  | pythonmysql | 22222222222 |
+----+-------+-------------+-------------+
3 rows in set (0.00 sec)

5.4. 关闭连接

前面连接成功了,但是在文件运行结束之前要关闭连接

# 3.关闭连接
conn.close()
cursor.close()

5.5. 第一个小案例

结合上述知识,可以让用户自定义输入:

import pymysqlwhile True:username = input("请输入用户名:")if username.upper() == "Q":breakpasswd = input("请输入密码:")mobile = input("请输入电话:")# 1.连接mysqlconn = pymysql.connect(host="127.0.0.1", port=3306, user="root", charset="utf8", passwd="4636996", db="demo")cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 2.发送指令# 列表形式sql = "insert into info(name, passwd, mobile) values(%s, %s, %s)"my_list = [username, passwd, mobile]cursor.execute(sql, my_list)conn.commit()  # 提交指令# 3.关闭连接conn.close()cursor.close()

在这里插入图片描述

然后查询表格,发现已添加上:

mysql> select * from info;
+----+-------+-------------+-------------+
| id | name  | passwd      | mobile      |
+----+-------+-------------+-------------+
|  1 | panda | 123465      | 12345678911 |
|  2 | 小明  | qwe789      | 11111111111 |
|  3 | 小李  | pythonmysql | 22222222222 |
|  4 | 小C   | 123456      | 33333333333 |
|  5 | 小S   | 456798      | 44444444444 |
+----+-------+-------------+-------------+
5 rows in set (0.00 sec)

5.6. 查询数据

import pymysql# 1.连接mysql
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="4636996", charset="utf8", db="demo")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2.发送指令
# cursor.execute("insert into info(name,passwd,mobile) values('panda','123465','12345678911')")# 列表形式
sql = "select * from info"
cursor.execute(sql)
# 获取返还的数据
my_list = cursor.fetchall()
for each in my_list:print(each)
# 3.关闭连接
conn.close()
cursor.close()

得到:

{'id': 1, 'name': 'panda', 'passwd': '123465', 'mobile': '12345678911'}
{'id': 2, 'name': '小明', 'passwd': 'qwe789', 'mobile': '11111111111'}
{'id': 3, 'name': '小李', 'passwd': 'pythonmysql', 'mobile': '22222222222'}
{'id': 4, 'name': '小C', 'passwd': '123456', 'mobile': '33333333333'}
{'id': 5, 'name': '小S', 'passwd': '456798', 'mobile': '44444444444'}

5.7 删除数据

import pymysql# 1.连接mysql
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="4636996", charset="utf8", db="demo")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2.发送指令
# cursor.execute("insert into info(name,passwd,mobile) values('panda','123465','12345678911')")# 列表形式
cursor.execute("delete from info where id=%s",[5])
conn.commit()# 3.关闭连接
conn.close()
cursor.close()

查询数据库数据得知已被删除:

mysql> select * from info;
+----+-------+-------------+-------------+
| id | name  | passwd      | mobile      |
+----+-------+-------------+-------------+
|  1 | panda | 123465      | 12345678911 |
|  2 | 小明  | qwe789      | 11111111111 |
|  3 | 小李  | pythonmysql | 22222222222 |
|  4 | 小C   | 123456      | 33333333333 |
+----+-------+-------------+-------------+
4 rows in set (0.00 sec)

5.8. 修改数据

import pymysql# 1.连接mysql
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="4636996", charset="utf8", db="demo")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2.发送指令
# cursor.execute("insert into info(name,passwd,mobile) values('panda','123465','12345678911')")# 列表形式
cursor.execute("update info set mobile='99999999999' where mobile=%s", ["22222222222"])
conn.commit()# 3.关闭连接
conn.close()
cursor.close()

查询数据库数据得知已被修改:

mysql> select * from info;
+----+-------+-------------+-------------+
| id | name  | passwd      | mobile      |
+----+-------+-------------+-------------+
|  1 | panda | 123465      | 12345678911 |
|  2 | 小明  | qwe789      | 11111111111 |
|  3 | 小李  | pythonmysql | 99999999999 |
|  4 | 小C   | 123456      | 33333333333 |
+----+-------+-------------+-------------+
4 rows in set (0.00 sec)

6.Flask+前端+MySQL案例

MySQL数据库使用的是上面的demo下的info表

项目的目录结构:

在这里插入图片描述

app.py完整代码:(把数据库的密码设置成你自己的)

from flask import Flask, render_template, request
import pymysqlapp = Flask(__name__)@app.route('/add/user', methods=['POST', 'GET'])
def add_user():if request.method == 'GET':return render_template("add_user.html")else:# 接收数据name = request.form.get("username")passwd = request.form.get("passwd")mobile = request.form.get("mobile")# 与数据库建立连接conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="demo", charset="utf8", port=3306)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 添加数据sql = "insert into info(name,passwd,mobile) values(%s,%s,%s)"data_list = [name, passwd, mobile]cursor.execute(sql, data_list)conn.commit()# 关闭连接conn.close()cursor.close()return "添加成功"@app.route('/show/user')
def show_user():# 与数据库建立连接conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="demo", charset="utf8", port=3306)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 查询数据sql = "select * from info"cursor.execute(sql)data_list = cursor.fetchall()# 关闭连接conn.close()cursor.close()return render_template("show_user.html", data_list=data_list)if __name__ == '__main__':app.run(debug=True)

用户注册界面add_user.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册</title>
</head>
<body>
<h1>注册</h1>
<div><form method="post" action="/add/user"><label>用户名:<input type="text" name="username" placeholder="请输入用户名......">密码:<input type="password" name="passwd" placeholder="请输入密码......">手机号:<input type="text" name="mobile" placeholder="请输入手机号......"></label><input type="submit" value="提 交"></form>
</div>
</body>
</html>

效果:

在这里插入图片描述

查询用户列表界面show_user.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!--替换为自己的BootSrap路径--><link rel="stylesheet" href="/static/plugins/bootstrap-3.4.1-dist/css/bootstrap.css">
</head>
<body>
<div class="container"><h1 style="text-align: center">用户列表</h1><div style="margin-top: 50px"><table class="table table-bordered"><thead><tr><td>序号</td><td>用户名</td><td>密码</td><td>手机号</td></tr></thead><tbody>{% for each in data_list %}<tr><td>{{each.id}}</td><td>{{each.name}}</td><td>{{each.passwd}}</td><td>{{each.mobile}}</td></tr>{% endfor%}</tbody></table></div>
</div>
<!--替换为自己的BootSrap里JS路径-->
<script src="/static/plugins/bootstrap-3.4.1-dist/js/bootstrap.js"></script>
<!--替换为自己的JS路径-->
<script src="/static/js/jquery-3.7.1.min.js"></script>
</body>
</html>

效果:

在这里插入图片描述

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

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

相关文章

《动手学深度学习(PyTorch版)》笔记4.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

mcu短时间内发生多次中断,如何解决中断丢失问题?

问题 嵌入式开发中&#xff0c;如果中断A的处理函数执行时间长&#xff0c;某段时间内&#xff0c;快速来了2个中断A(例如&#xff1a;外部管脚输入信号变化)&#xff0c;则会导致第2个中断丢失。 我有几个疑问&#xff1a; 1.目前市面上的芯片&#xff0c;是否支持缓存中断标志…

Java 字符串 09 StringJoiner(可以指定间隔符号,开始符号,结束符号)

创建对象&#xff0c;添加元素&#xff1a; import java.util.Scanner; import java.util.StringJoiner;public class practice{public static void main(String[ ] args){StringJoiner sj new StringJoiner("---");sj.add("aaa").add("bbb")…

web前端项目-五子棋【附源码】

五子棋&#xff08;人机对弈&#xff09; 本项目【五子棋】是一款人机对弈的策略型棋类游戏。可以选择落子方&#xff1b;游戏难度和是否显示落子次序。游戏双方分别使用黑白两色的棋子&#xff0c;在棋盘直线与横线的交叉点上进行对弈。五子棋可以促进大脑发育、提高思维能力…

快速上手!使用Docker和Nginx部署Web服务的完美指南

前言 Docker是一种容器化技术&#xff0c;它可以将应用程序及其依赖项打包到一个独立的、可移植的容器中。这意味着开发人员可以在任何环境中轻松部署和运行他们的应用程序&#xff0c;而无需担心环境差异和依赖问题。而Nginx则是一款高性能的Web服务器和反向代理服务器&#x…

【学网攻】 第(9)节 -- 路由器使用以及原理

系列文章目录 目录 系列文章目录 文章目录 前言 一、路由器是什么&#xff1f; 二、实验 1.引入 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan…

微信小程序(十三)生命周期-更新应用提醒

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.onLaunch用法 2.onShow用法 3.onHide用法 4.应用更新API的调用模板 源码&#xff1a; App({//小程序初始化时触发&#xff0c;全局只触发一次onLaunch(option) {//可以获取场景值和启动参数&#xff0c;eg.opt…

【java面试】常见问题(超详细)

目录 一、java常见问题JDK和JRE的区别是什么&#xff1f;Java中的String类是可变的还是不可变的&#xff1f;Java中的equals方法和hashCode方法有什么关系&#xff1f;Java中什么是重载【Overloading】&#xff1f;什么是覆盖【Overriding】&#xff1f;它们有什么区别&#xf…

深入理解STM32中断处理机制

深入理解STM32中断及其使用方法&#xff08;基于HAL库&#xff09; STM32微控制器作为一款强大的嵌入式系统芯片&#xff0c;在各种应用中都需要使用中断来实现实时响应和处理各种事件。本文将深入讨论STM32中断的概念、HAL库的中断处理机制以及如何在STM32CubeMX中配置和使用…

【昕宝爸爸小模块】什么是POI,为什么它会导致内存溢出?

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

时间编程相关的API

1》time -- 获取日历时间 日历时间&#xff1a;1970年1月1日距离现在的秒数 #include <time.h> time_t time(time_t *timer): 获取当前的系统时间&#xff0c;并以time_t类型返回。 2》将日历时间转化为本地时间 localtime #include <time.h> struct tm *localtim…

【CentOS】Linux 文件权限与权限修改

目录 1、Linux 中的文件属性 2、如何修改文件属性与权限 3、目录权限与文件权限的区别 4、Linux 中的文件扩展名 用户与用户组是Linux文件权限的重要组成部分。 首先&#xff0c;一定要明确用户与用户组的概念&#xff1a; Linux 一般将文件可读写的身份分为三个类别&#…

亚马逊测评,完善的自养号系统需要具备哪些要求

在亚马逊等跨境电商平台的严格审查下&#xff0c;许多卖家和买家都遭到了封号。这些封号事件对依赖线上销售的小型卖家造成了巨大的冲击。我们发现大部分账号被封的原因在于底层环境搭建不当。 无论是在亚马逊还是其他跨境电商平台&#xff0c;如ebay、速卖通、虾皮、Lazada等…

Docker深入解析:从基础到实践

Docker基础知识 Docker是什么&#xff1a;定义和核心概念解释 Docker是一个开源项目&#xff0c;它诞生于2013年&#xff0c;旨在自动化应用程序的部署过程&#xff0c; 让应用程序能够在轻量级的、可移植的、自给自足的容器中运行。这些容器可以在几乎任何机器上运行&#xf…

顶顶通呼叫中心中间件利用自动外呼进入机器人的压力测试配置流程

文章目录 前言呼入进入机器人配置流程创建线路创建线路组呼入配置 创建自动外呼任务1. 实现“一端放音&#xff0c;另一端进入机器人”操作创建拨号方案—“模拟放音”呼叫路由—“internal”启用拨号方案—“模拟放音”队列外呼配置 2. 实现“两端都进入机器人”操作队列外呼配…

线扫相机使用教程

一.线扫相机的采集原理 在现有的工业 2D 相机中&#xff0c;主要有两种类型的相机&#xff0c;面阵相机和线扫相机。这两种相机有其 各自的特点。 面阵相机&#xff1a;主要用于采集较小尺寸的产品&#xff0c;特别是长度方向较小的产品。其采集原理是通过 单次或多次曝光&…

Docker容器操作 Docker创建并运行Nginx、Redis

容器操作的命令如图&#xff1a; 容器命令 # 创建并运行一个容器&#xff0c;运行成功后会返回容器id docker run# 暂停&#xff0c;将容器挂起&#xff0c;内存暂存&#xff0c;CPU不再执行 docker pause # 恢复运行&#xff0c;内存恢复&#xff0c;CPU恢复 docker unpause#…

【深度学习】sdxl中的 tokenizer tokenizer_2 区别

代码仓库&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 截图&#xff1a; 为什么有两个分词器 tokenizer 和 tokenizer_2&#xff1f; 在仔细阅读这些代码后&#xff0c;我们了解到 tokenizer_2 主要是用于 refiner 模型的。 #…

12000 份发财红包封面免费送

发财红包封面又来啦 寓意新年加薪发财 两个红包封面&#xff0c;各6000份&#xff0c;共12000份 剩余额度全打光&#xff0c;够诚意吧 附送原图&#xff08;阿里通义万相生成&#xff09; 祝大家 春节快乐&#xff0c;新年涨薪发财 龙年行大运&#xff0c;万事皆如愿 使用说明 …

微信小程序(十七)自定义组件生命周期(根据状态栏自适配)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.获取手机状态栏的高度 2.验证attached可以修改数据 3.动态绑定样式数值 源码&#xff1a; myNav.js Component({lifetimes:{//相当于vue的created,因为无法更新数据被打入冷宫created(){},//相当于vue的mount…