文章目录
- 一.Python-flask使用数据库
- 第一步:首先安装包
- 安装 flask-sqlalchemy (用于ORM):
- 安装 flask-migrate (用于数据迁移):
- 安装 pymysql (MySQL驱动):
- 第二步:在__init__ 配置
- 第三步:插件管理
- 第一步:新建一个py:用于管理插件
- 第二步:初始化插件
- 第四步:在models新建model的类
- 第五步:数据迁移(表变化,数据库里的表也需要自动变化)
- 二. python-单表操作
- 2.1添加
- 2.1.1 添加单个信息
- 2.1.2 添加多条信息
- 2.1.3事务
- 2.2 删除
- 2.2.1 删除第一条数据
- 2.3 修改
- 2.3.1 修改第一条数据
- 2.4 查找
- 2.4.1 查找
- 2.5 分页
- 2.5.1 手动翻页
- 2.5.2 自动翻页
- 三. python-多表操作
- 3.1:一对一
- 3.2:一对多
- 第一步:建立模型(类)
- `建立关系方法一:`
- `建立关系方法二:`推荐
- 第二步:实操
- 单表操作:添加主表:
- 单表操作:添加子表:
- 单表操作:修改、删除主表:
- 多表操作:查询
- 3.3:多对多
- 第一步:建立模块
- 第二步:实操
- 查
一.Python-flask使用数据库
第一步:首先安装包
安装 flask-sqlalchemy (用于ORM):
pip install flask-sqlalchemy -i https:///simple
安装 flask-migrate (用于数据迁移):
pip install flask-migrate -i https:///simple
安装 pymysql (MySQL驱动):
pip install pymysql -i https:///simple
第二步:在__init__ 配置
第三步:插件管理
第一步:新建一个py:用于管理插件
第二步:初始化插件
第四步:在models新建model的类
# models.py : 模型,数据库
from .exts import db
# 模型 数据库
# 类 ==> 表结构
# 类属性 ==> 表字段
# 一个对象 ==> 表的一行数据
# 模型Model:类
# 必须继承 db.Model
class User(db.Model):
# 表名
__tablename__ = 'tb_user'
# 定义表字段
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(30), unique=True, index=True)
age = db.Column(db.Integer, default=1)
sex = db.Column(db.Boolean, default=True)
salary = db.Column(db.Float, default=100000, nullable=False)
salary2 = db.Column(db.Float, default=100000, nullable=False)
# db.Column : 表示字段
# db.Integer:表示整数
# primary_key=True : 主键
# autoincrement=True : 自动递增
# db.String(30): varchar(30) 可变字符串
# unique=True : 唯一约束
# index=True : 普通索引
# default=1 : 默认值
# nullable=False : 是否允许为空
第五步:数据迁移(表变化,数据库里的表也需要自动变化)
二. python-单表操作
2.1添加
2.1.1 添加单个信息
2.1.2 添加多条信息
2.1.3事务
2.2 删除
2.2.1 删除第一条数据
2.3 修改
2.3.1 修改第一条数据
2.4 查找
2.4.1 查找
# 查:查询数据
# 条件
@blue.route('/userget/')
def user_get():
# all(): 返回所有数据,返回列表
users = User.query.all()
# print(users, type(users)) # <class 'list'>
# print(User.query, type(User.query)) # <class 'flask_sqlalchemy.query.Query'>
# filter() : 过滤,得到查询集,类似SQL中的where
users = User.query.filter()
# print(users, type(users)) # 查询集
# print(list(users))
# get():查询到对应主键的数据对象
user = User.query.get(8)
# print(user, type(user)) # User对象 <class 'App.models.User'>
# print(, user.age) # 获取数据的属性
# filter() : 类似SQL中的where
# filter_by() : 用于等值操作的过滤
# users = User.query.filter(User.age==20)
# users = User.query.filter_by(age=20)
users = User.query.filter(User.age>20) # 可以用于非等值操作
# print(list(users)) # [冰冰20]
# first() : 第一条数据
# first_or_404(): 第一条数据,如果不存在则抛出404错误
user = User.query.first()
# user = User.query.filter_by(age=100).first_or_404()
# print(user)
# count(): 统计查询集中的数据条数
users = User.query.filter()
# print(users.count()) # 20
# limit() : 前几条
# offset() : 跳过前几条
users = User.query.offset(3).limit(4)
# print(list(users))
# order_by() : 排序
users = User.query.order_by('age') # 升序
users = User.query.order_by(desc('age')) # 降序
# print(list(users))
# 逻辑运算:and_,or_,not_
users = User.query.filter(User.age>20, User.age<25) # 且,常用
users = User.query.filter(and_(User.age>20, User.age<25)) # 且
users = User.query.filter(or_(User.age>25, User.age<20)) # 或
users = User.query.filter(not_(or_(User.age>25, User.age<20))) # 非
# print(list(users))
# 查询属性
# contains('3'): 模糊查找,类似SQL中的like
users = User.query.filter(.contains('3'))
# in_(): 其中之一
users = User.query.filter(User.age.in_([10, 20, 30, 40, 50]))
# startswith() : 以某子串开头
# endswith() : 以某子串结尾
users = User.query.filter(.startswith('冰')) #
users = User.query.filter(.endswith('2'))
# print(list(users))
# __gt__: 大于
users = User.query.filter(User.age.__gt__(25))
print(list(users))
return 'success'
2.5 分页
2.5.1 手动翻页
# 分页,翻页
# 1.手动翻页
# offset().limit()
# 数据: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
# 页码:page=1
# 每页显示数量:per_page=5
# page=1 : 1,2,3,4,5 => offset(0).limit(5)
# page=2 : 6,7,8,9,10 => offset(5).limit(5)
# page=3 : 11,12,13,14,15 => offset(10).limit(5)
# page=4 : 16,17,18,19,20 => offset(15).limit(5)
# ... ....
# page=n : => offset((page-1)*per_page).limit(per_page)
users = User.query.offset((page-1)*per_page).limit(per_page)
2.5.2 自动翻页
# 2.paginate对象
@blue.route('/paginate/')
def get_paginate():
# 页码:默认显示第一页
page = int(request.args.get('page', 1))
# per_page: 每页显示数据量
per_page = int(request.args.get('per_page', 5))
# print(page, type(page))
# print(per_page, type(per_page))
# paginate()
p = User.query.paginate(page=page, per_page=per_page, error_out=False)
# paginate对象的属性:
# items:返回当前页的内容列表
print(p.items)
# has_next:是否还有下一页
# print(p.has_next)
# has_prev:是否还有上一页
# print(p.has_prev)
# next(error_out=False):返回下一页的Pagination对象
# print(p.next(error_out=False).items)
# prev(error_out=False):返回上一页的Pagination对象
# print(p.prev(error_out=False).items)
# page:当前页的页码(从1开始)
print(p.page)
# pages:总页数
print(p.pages)
# per_page:每页显示的数量
# print(p.per_page)
# prev_num:上一页页码数
# print(p.prev_num)
# next_num:下一页页码数
# print(p.next_num)
# total:查询返回的记录总数
print(p.total)
return render_template('paginate.html', p=p)
三. python-多表操作
3.1:一对一
3.2:一对多
第一步:建立模型(类)
建立关系方法一:
给子表添加relationship来应用外键指向那个orm(相对主表)模型
主表-子表都要添加
back_populates:告诉另个表,你在用我的时候,可以定义一个名字为back_populates='xxx’的,但是你要有这个属性
建立关系方法二:
推荐
只在子表添加:backref=‘’’
子表:主动给主表绑定一个自身为单位的属性
返过来也可以:子表:
主表:使用单引号
懒加载:用的时候才进行关联加载
第二步:实操
单表操作:添加主表:
单表操作:添加子表:
单表操作:修改、删除主表:
删除班级:因为是主表,所以会取消关联关系
多表操作:查询
正向查询:通过主表查子表
反向查询:通过子表查主表
通过主表查子表
3.3:多对多
第一步:建立模块
中间表有点特殊
第二步:实操
增删改:同上
查