Python3 - MySQL学习教程

Posted 韩俊强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 - MySQL学习教程相关的知识,希望对你有一定的参考价值。

文章目录

1.安装与登录

mysql Community Downloads下载: https://dev.mysql.com/downloads/mysql/
MySQL Community Server 此版本免费够用

安装了MySQL系统, 类似Windows也是多用户的系统, 默认自带了用户, 就是root超级管理员

使用mysql数据库, 需要进行登录, cmd 以指令的形式进行登录

mysql -u 用户名 -p 回车输入用户对应的密码

Mac 终端重启后~/.bash_profile不生效问题
Mac 每次都要执行source ~/.bash_profile 配置的环境变量才生效
自己在 ~/.bash_profile 中配置环境变量, 可是每次重启终端后配置的不生效,需要重新执行 : $source ~/.bash_profile

发现zsh加载的是 ~/.zshrc文件,而 ‘.zshrc’ 文件中并没有定义任务环境变量。

解决办法:
在~/.zshrc文件最后(没有则创建一个 ~/.zshrc文件),增加一行:
source ~/.bash_profile

2.管理工具

数据库管理工具: Navicat Premium

远程连接登录: mysql -uroot -hip地址 -p

3.关系型数据库

​ 存储的具有关系的实体对应的实体表, 换句话说这些库里面放的都是二维表格, 表和表之间是有联系的

一对一

​ 一张表中存储的是一个人的信息: 身份证号 姓名

​ 一张表中存储的是个人的详细信息: 身份证号 年龄 籍贯 现住址 学历

一对多

​ 一张表中存储的是部门的信息 : 部门编号 部门名称

​ 一张表中存储的员工信息: 部门编号 员工编号 员工名称

主从关系

​ 主表 — 一的那一方是主表

​ 从表 — 多的那方是从表

​ 从表中会设置一个字段关联主表的标记字段, 从表中的字段的哪个字段是依据主表中的标记字段的;

多对多

​ 课程和学生

​ 一门课程 — 多个学生

​ 一个学生 — 多门课程

​ 建立一个中间表, 通过中间表联系多对多

4.MSQL概述

MYSQL数据库中识别的语言叫做SQL

创建数据库, 数据表, 对表中的数据进行 增, 删, 改, 查

创建库的指令
create database 数据库名 charset=utf8; utf8--设置数据库编码, 可以识别中文

创建成功打印:
Query OK, 1 row affected, 1 warning (0.00 sec) 

创建数据表指令
create table 表名(
	字段名 数据类型 约束,
	字段名 数据类型 约束,
	字段名 数据类型 约束,
	字段名 数据类型 约束
	...
) 
主键约束 --- 数据的唯一标识 primary key
非空约束 --- 标识这一列数据不允许为空  not null
唯一约束 --- 这一列数据不能重复
外键约束 --- 从表关联主表的联系字段

数据类型
	整型 int 
	浮点型 float double decimal
					float(m, n)
						n 表示的是小数的位数
						m 表示的是整体数据的位数
						float(5, 2) 包含小数在内是5位, 小数是2位
	字符串类型
			varchar(3) 3 --- 表示开辟的字节数
			text --- 内容比较多的
	时间类型
			date 年月日
			insert into stu values('小明', 1001, 20, 98.34, '2001-11-11');

5.对象关系映射

Python是面向对象编程的, 操作的所有的数据都是对象

Python都没有办法直接连接数据库, 需要一个连接池, PyMySql

PyMySql — 通过它连接数据库

pip install pymysql
pip install flask-sqlalchemy --- 支持允许进行对象映射

警告内容:

SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and  will be disabled by default in the future. Set it to True or False to  suppress this warning.
warnings.warn(FSADeprecationWarning

解决方法:将configSQLALCHEMY_TRACK_MODIFICATIONS设置为TureFlase即可

app = Flask(__name__)
app.config['ENV'] = 'development'
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/blogdb'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

6.数据库迁移

数据表结构发生变化, 可以及时同步到数据库中

pip install flask-migrate   迁移数据库需要的工具
迁移数据库的指令: 
1.初始化一个迁移仓库, 用于存放每次修改的版本
python 项目启动文件名 自己设置的操作数据库迁移的指令名 init
		python manager.py database init
		
2.根据模型生成迁移版本
python 项目启动文件名 自己设置的操作数据库迁移的指令名 migrate 
		 python manager.py database migrate

3.把模型同步到数据库中
python 项目启动文件名 自己设置的操作数据库迁移的指令名 upgrade
	 	python manager.py database upgrade

4.版本回退
python 项目启动文件名 自己设置的操作数据库迁移的指令名 downgrate
		python manager.py database downgrade

注意: flask_migrate 无法导入 MigrateCommand问题:

​ 删除 flask_migrate 高版本, 减低到3.0以下版本, 例如指定2.7.0

常见错误:

harry@bogon BlogProject % python manager.py database migrate
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
ERROR [flask_migrate] Error: Can't locate revision identified by '5c781b45034e'
解决方法:
原由: 版本号已存在, 删除即可
user blogdb;
show tables;

+------------------+
| Tables_in_blogdb |
+------------------+
| alembic_version  |
| staff            |
+------------------+
2 rows in set (0.01 sec)

drop table alembic_version

Query OK, 0 rows affected (0.00 sec)

7.蓝图

根据项目的不同板块, 把路由规则进行规划, 减少启动文件的代码冗余

一个板块对应一个蓝图, 在这个蓝图下有这个板块中对应的路由规则

8.练习: 搭建一个博客网站

登录

注册

修改信息

发表博客

给博客点赞 --- 取消点赞

可以展示用户自己的博客 --- 可以删除 ---- 可以修改

首页 --- 用户发表的那些博客 ---- 搜索博客

涉及的数据表

用户表

博客表(一对多)

点赞表(多对多) --- 用户和博客点赞

模型 ---- 需要三个

板块 ---- 蓝图2个 用户 博客

项目结构
	|-manager.py ---- 项目的启动文件
	|-settings.py ---- 配置信息的文件
	|-templates ---- 文件夹 --- 存储模板文件
	|-static ---- 文件夹 ---- 存储本地静态资源
	|-apps ---- 包(文件夹) ---- 项目相关的一些内容
			|-models 包 ---- 放模型文件
			|-views 包 ---- 放蓝图文件的
	|-exts 包(扩展) --- 存放的是一些扩展的内容(数据库等等)

项目地址: BlogProject

9.跨站请求伪造保护

pip install flask-wtf
'''
请求的操作
'''
from flask import Flask, render_template, request # request 接受客户端发送请求时的请求对象
from flask_script import Manager
# 导入保护类
from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)
app.config['ENV'] = 'development'
app.config['DEBUG'] = True
# 给跨站请求伪造保护设置令牌
app.config['SECRET_KEY'] = '2e2189u43WD2R323243fewvwvwevbhytjuasi;p,5678'
manager = Manager(app)
# 创建对象, 保护app
CSRFProtect(app)

<form action=" url_for('login') " method="post">
        # 向网站传递受保护的令牌 csrf_token() 获取令牌的方式 #
        <input type="hidden" name="csrf_token" value=" csrf_token() ">
        <div>用户名:<input type="text" name="username"></div>
        <div>密码:<input type="password" name="psw"></div>
        <div><input type="submit" value="登录"></div>
    </form>

10.模板继承

写页面的时候, 多个界面有相同的部分, 可以把相同的放在一个模板文件中, 需要这些页面时, 可以继承这个模板

子模板有扩展如何扩展?
	需要再父模板中设置对应的可填充的位置

以上是关于Python3 - MySQL学习教程的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的关系

Mysql数据库基础

Python3 - MySQL学习教程

Python3 - MySQL学习教程

Python学习 Day16 Python3 MySQL 数据库

MySQL 表的一对一对多多对多问题