文章目录
- 一.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://pypi.douban.com/simple
安装 flask-migrate (用于数据迁移):
pip install flask-migrate -i https://pypi.douban.com/simple
安装 pymysql (MySQL驱动):
pip install pymysql -i https://pypi.douban.com/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中的whereusers = 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.name, 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中的likeusers = User.query.filter(User.name.contains('3'))# in_(): 其中之一users = User.query.filter(User.age.in_([10, 20, 30, 40, 50]))# startswith() : 以某子串开头# endswith() : 以某子串结尾users = User.query.filter(User.name.startswith('冰')) #users = User.query.filter(User.name.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:多对多
第一步:建立模块
中间表有点特殊
第二步:实操
增删改:同上
查