# encoding=utf-8
"""
1、ORM(object relational Mapping)介绍
(1)存储数据的仓库,按照一定的规则(结构)进行数据存储的容器
(2)ORM对象关系映射A、通过面向对象来描述元数据(数据库数据和结构),将描述内容自动持久化到关系数据库当中B、本质上是将数据从一种形式转换到另一种形式,ORM的转换对数据库操作的消耗变大C、使用ORM之后能够提供开发的效率,但是有额外的开销D、通过使用描述对象和数据库之间的映射关系,将面向对象的编程思想应用到对数据库的操作上面E、类对应数据库当中的表,通过编程来描述数据库表,结构和增删改查,将描述映射到数据库,完成操作
(3)SQLAlchemy是由Python编写的,实现了ORM面向对象的编程思想,极大的方便对数据库的操作[官网:http://www.pythondoc.com/flask-sqlalchemy/config.html]
(4)Flask本身不携带orm,小型快速的开发,可以使用数据库的api(pymysql);sqlalchemy是仿写django的orm开发的,使用效果上不如django的ORM
(5)大中型项目需要使用flask的ORM插件,flask-sqlalchemy是基于flask对sqlalchemy的封装
(6)数据库安装:采用flask封装过的三方ORM模块进行数据库管理>> pip install flask-sqlalchemy>> from flask_sqlalchemy import SQLAlchemy
2、数据库链接
(1)链接Mysql数据库:app.config["SQLALCHEMY_DATABASE_URI"]="mysql+pymysql://用户名:密码@链接地址/数据库名?charset=utf8"
(2)链接sqlite数据库:app.config["SQLALCHEMY_DATABASE_URI"]="sqlite:///"+sqlite文件路径
(3)数据库的配置A、数据库的链接地址:app.config["SQLALCHEMY_DATABASE_URI"]=数据库urlB、配置查看映射的sql语句:app.config["SQLALCHEMY_ECHO"]=TrueC、数据库动态跟踪修改:app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]=TrueD、请求结束自动提交:app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]=True
(4)绑定服务器和数据库:db=SQLAlchemy(app)
(5)通过创建类-映射数据表;类中的字段-映射列>> 数据表:默认类名就是表名,每一个变量都是一个数据库字段>> 使用ORM建模时,默认类名就是表名,类中的每个变量就是一个数据库表字段A、创建数据表(将新建的数据库模型同步到数据库中,生成对应的表):db.create_all()B、错误:No Model named MySQLdb>> 原因:python2中使用MySQLdb,python3中使用pymysql>> 安装pymysql:pip install pymysql>> 数据库链接方式修改:"mysql+pymysql://用户名:密码@链接地址/数据库名"
3、数据类型A、Integer:整数型B、Float:浮点数C、Date:日期(年月日)D、DateTime:时间(年月日时分秒)E、Text:长文本类型F、String:变长字符串类型
4、常用参数:主键primary_key、自增auto_increment、唯一unique、索引index、空值nullable、默认值default
5、ORM操作流程
(1)ORM操作通常是在视图当中完成
(2)视图功能调用ORM查询数据库数据
(3)返回HTML渲染结果或者直接返回数据
(4)ORM的数据库模块(FACM):flask-sqlalchemy
(5)在整个项目当中,数据库在确定之后,很少进行修改
(6)ORM通常在视图当中完成,调用ORM查询数据库,返回HTML渲染结果或直接返回数据>> 面向对象的类映射成数据库的表,通过映射关系来完成数据库的操作,降低数据库操作的难度和繁琐程度>> 是一个为Flask应用增加支持的扩展,致力于简化使用,提供了有用的默认值和额外的API来简单完成任务
6、基本操作命令
(1)创建基础继承表:class BaseModel(db.Model)
(2)声明数据表只继承,不创建:__abstract__=True
(3)封装添加数据函数save(self):创建游标session=db.session();谁调用,添加谁session.add(self);提交操作session.commit()
(4)封装修改数据函数update(self):创建游标session=db.session();提交操作session.commit()
(5)封装删除数据函数delete(self):创建游标session=db.session();谁调用,添加谁session.delete(self);提交操作session.commit()
(6)定义数据表:class Worker(BaseModel);添加字段:字段名=db.Column(数据类型,字段约束)
(7)映射app数据库中的表(本程序的flask实例,已连接到数据库):db.reflect(app=app)
(8)获取所有数据库,返回immutabledict,包含数据库中所有表结构:tables=db.metadata.tables
(9)创建所有数据表:db.create_all()
7、增加数据
(1)构建单条数据增加s = Model(name='小二')db.session.add(s)db.commit()
(2)构建多条数据增加s1 = Model(name='张三')s2 = Model(name='李四')db.session.add_all([s1,s2])db.commit()
(3)封装增加s = Model()s.name = '王五's.save()
8、查询数据Model.query.get(id):查询指定id的一条数据,返回对象/NoneModel.query.all():查询符合条件的所有数据,返回列表/空列表Model.query.filter(Model.name=='小二'):查询符合条件的数据,返回列表/空列表Model.query.filter(Model.name=='小二').first():查询符合条件的一条数据,返回列表/空列表Model.query.filter_by(name=='小二'):查询符合条件的数据,返回列表/空列表Model.query.filter(Model.name.like("%g%")):模糊查询(%匹配零或多个,_匹配一个),返回列表/空列表Model.query.filter(Model.name=='小二').offset(0).limit(1):限制查询,offset偏移位置,limit返回条数,返回列表/空列表Model.query.filter().order_by(Model.name.asc()):正序排序查询到符合条件的数据,返回列表/空列表Model.query.filter().order_by(Model.name.desc()):倒序排序查询到符合条件的数据,返回列表/空列表Model.query.filter(func.min(Model.id)).filter(Model.name.like('杜%')):查询符合条件的最小id的数据,返回对象/NoneModel.query.filter(func.max(Model.id)).filter(Model.name.like('杜%')):查询符合条件的最大id的数据,返回对象/NoneModel.query.filter(func.count(Model.id)).filter(Model.name.like('杜%')):查询符合条件的数据的数目,返回对象/NoneModel.query.filter(func.sum(Model.id)).filter(Model.name.like('杜%')):查询符合条件的所有id的和,返回对象/NoneModel.query.filter(func.avg(Model.id)).filter(Model.name.like('杜%')):查询符合条件的所有id的平均值,返回对象/NoneModel.query.filter(func.max(Model.id)).group_by(Model.gender):根据性别分组,查询符合条件的最大id的数据,返回列表/空列表Model.query.filter(and_(Model.gender=='男',Model.name.like('杜%'))):查询两个条件均符合的数据Model.query.filter(or_(Model.gender=='男',Model.name.like('杜%'))):查询两个中任一符合条件的数据Model.query.filter(not_(Model.gender=='男')):查询性别不是男的数据
9、修改数据p = Model.query.get(1)p.name = '未知'db.session.commit()
10、删除数据:项目中通常使用物理删除/逻辑删除代替真实删除p = Model.query.get(1)db.session.delete(p)db.session.commit()
"""
# 导入模块
import random
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import func, not_, or_, and_
from BluePro.models import BaseModelbasic = "F:\\MyProject\\027_Flask框架介绍\\BluePro"# 创建web服务器(http)实例:内置方法__name__是预定义变量,被设置为使用本模块,html存放的路径,静态文件的路径
app = Flask(__name__)# 设置数据库配置
# 配置创建sqlite数据库文件
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + f"{basic}\\database.sqlite"
# 配置数据库动态跟踪修改
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True# 实例化SQLAlchemy
db = SQLAlchemy(app)# 创建测试表
class Student(BaseModel):__tablename__ = "student"# 测试用户名name = db.Column(db.String(32), unique=True)# 测试密码pswd = db.Column(db.String(32))# 用户性别gender = db.Column(db.String(32))# 用户评分score = db.Column(db.Float)@app.route('/database/create/')
def create():db.create_all()return "创建完毕"# 数据库操作--增加数据
@app.route('/database/add/')
def add_data():# 数据表增加一条数据student1 = Student(name='小二',pswd="111")db.session.add(student1)db.session.commit()# 数据表增加多条数据student2 = Student(name="仙仙",pswd="111")student3 = Student(name="圻宝",pswd="111")db.session.add_all([student2, student3])db.session.commit()# 批量增加数据for last in "昆晏香雷松莲灵晓艺瑗":s = Student()s.name = "赵"+lasts.pswd = "111"s.gender = random.choice(["男","女"])s.score = random.randint(40,100)s.save()return f'已向数据表增加数据'# 数据库操作--删除数据
@app.route('/database/delete/')
def del_data():student = Student.query.all()if student:student = Student.query.all()t = random.choice(student)db.session.delete(t)db.session.commit()data = f'已从数据表中删除数据:{t.name}'return dataelse:data = f'数据表中没有数据,请执行添加操作'return data# 数据库操作--修改数据
@app.route('/database/update/')
def upd_data():student = Student.query.all()if student:t = random.choice(student)old = t.namet.name = f"管理员-{old}"db.session.commit()data = f'已从数据表中修改数据:{old}-->管理员'return dataelse:data = f'数据表中没有数据,请执行添加操作'return data# 数据库操作--查询数据
@app.route('/database/select/<string:model>/')
def sel_data(model):student = Student.query.all()if student:# 精准查询------查询id为1的员工,返回对象/Noneif model == "get":# 此处为了统一,将结果存入列表中student = [Student.query.get(1)]lst = [s.name for s in student]data = f'get(id)精确:{len(lst)}条,{lst}'# 全部查询------查询所有员工信息,返回列表/空列表elif model=="all":student = Student.query.all()lst = [s.name for s in student]data = f'all()全部:{len(lst)}条,{lst}'# 单条件查询------查询所有 男员工,返回列表/空列表elif model == "filter_by":student = Student.query.filter_by(gender="男").all()lst = [s.name for s in student]data = f'filter_by()单条件:{len(lst)}条,{lst}'# 多条件查询------查询所有分数大于80 的男生elif model == "filter":student = Student.query.filter(Student.score > 80,Student.gender == "男").all()lst = [s.name for s in student]data = f'filter()多条件:{len(lst)}条,{lst}'# 模糊查询+多条件查询------查询所有钱姓 的男生elif model == "like":student = Student.query.filter(Student.name.like("赵%")).all()lst = [s.name for s in student]data = f'filter()+like()模糊:{len(lst)}条,{lst}'# 单限制查询------查询10名 男生elif model == "limit":student = Student.query.filter(Student.gender == "男").limit(10).all()lst = [s.name for s in student]data = f'filter()+limit()限制:{len(lst)}条,{lst}'# 多限制查询------从20名开始 查询10名 男生elif model == "offset":student = Student.query.filter(Student.gender=="男").limit(10).offset(20).all()lst = [s.name for s in student]data = f'filter()+limit()+offset()范围限制:{len(lst)}条,{lst}'# 正排序查询------按照成绩  查询所有王姓成员elif model == "order_by+asc":student = Student.query.filter(Student.name.like("赵%")).order_by(Student.score).all()lst = [s.name for s in student]data = f'filter()+order_by().asc()正排序:{len(lst)}条,{lst}'# 反排序查询------按照成绩  查询所有王姓成员elif model == "order_by+desc":student = Student.query.filter(Student.name.like("赵%")).order_by(Student.score.desc()).all()lst = [s.name for s in student]data = f'filter()+order_by().desc()反排序:{len(lst)}条,{lst}'# 聚合查询 : max、min、count、sum、avg(导入func模块包)# 最大值查询----统计所有赵姓男生的最好成绩elif model == "max":lst = db.session.query(Student.name,func.max(Student.score)).filter(Student.gender == "男",Student.name.like("赵%")).all()data = f'func.max()+filter()最大值:{lst}'# 最小值查询----统计所有赵姓男生的最差成绩elif model == "min":lst = db.session.query(Student.name,func.min(Student.score)).filter(Student.gender == "男",Student.name.like("赵%")).all()data = f'func.min()+filter()最小值:{lst}'# 数量查询----统计所有赵姓男生的数量elif model == "count":lst = db.session.query(Student.name,func.count(Student.id)).filter(Student.gender == "男",Student.name.like("赵%")).all()data = f'func.count()+filter()数量:{lst}'# 求和查询----统计所有赵姓男生的总成绩elif model=="sum":lst = db.session.query(Student.name,func.sum(Student.score)).filter(Student.gender == "男",Student.name.like("赵%")).all()data = f'func.sum()+filter()统计和:{lst}'# 平均查询----统计所有赵姓男生的平均成绩elif model == "avg":lst = db.session.query(Student.name,func.avg(Student.score)).filter(Student.gender == "男",Student.name.like("赵%")).all()data = f'func.avg()+filter()平均值:{lst}'# 分组查询------男女数目查询elif model == "group":lst = db.session.query(Student.gender,func.count(Student.id)).group_by(Student.gender).all()data = f'group_by()分组:{lst}'# 逻辑查询------并且and_:各个条件均成立,返回列表/空列表elif model == "and":student = Student.query.filter(and_(Student.gender == "男",Student.name.like("孙%"))).all()lst = [s.name for s in student]data = f'filter()+and_()并且全成立:{len(lst)}条,{lst}'# 逻辑查询------或者or_:各个条件中只要有一个成立,返回列表/空列表elif model == "or":student = Student.query.filter(or_(Student.gender == "男",Student.name.like("孙%"))).all()lst = [s.name for s in student]data = f'filter()+or_()或者有成立:{len(lst)}条,{lst}'# 逻辑查询------非not_:条件不成立,返回列表/空列表elif model == "not":student = Student.query.filter(not_(Student.gender == "男")).all()lst = [s.name for s in student]data = f'filter()+not_()非-不成立:{len(lst)}条,{lst}'else:data = "小伙砸,社会险恶,你没查到任何线索"return dataelse:data = f'数据表中没有数据,请执行添加操作'return data# 启动项目服务器--可以通过参数更改,通常网站的页面需要放到网站服务器上,用户无法双击打开
if __name__ == '__main__':app.run(# host:主机地址host="localhost",# port:访问端口port=80,# debug:调试模式,测试环境True,生产环境Fasledebug=True,# use_reloader:自动重启use_reloader=True)

Flask05_ORM单表相关推荐

  1. 使用Servlet完成单表的CRUD

    实现步骤 第一步:准备一张数据库表.(sql脚本) 第二步:准备一套HTML页面(项目原型)[前端开发工具使用HBuilder] 第三步:分析我们这个系统包括哪些功能 第四步:在IDEA当中搭建开发环 ...

  2. 3.4.1 单表查询

    3.4.1 单表查询 一.选择表中 若干列 1 查询 全体学生的  学号  和 姓名 select   sno,  sname from student 3 查询全体学生的   详细记录 select ...

  3. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models.T ...

  4. GoldenGate复制单表开并行

    最近有几项业务下线,需要从一张表中删除6.8亿多条数据.想办法把数据删除掉了,但对应的ogg灾备端复制时有了的延迟,而且延迟的时间起来越长. 对于表太多造成的延迟可以把所有表分为多个组来做复制,于是想 ...

  5. MapReduce编程系列 — 5:单表关联

    1.项目名称: 2.项目数据: chile    parent Tom    Lucy Tom    Jack Jone    Lucy Jone    Jack Lucy    Mary Lucy  ...

  6. oracle 查询天,Oracle查询_ 单表查询

    前面我们详解了关于Oracle的增删改,今天让我们接着来学习Oracle的查询吧, Oracle中查询可是重头戏噢!!!跟着煌sir的步伐,走位,走位~~~ 小知识锦囊 在此前,先讲解一个小知识点 O ...

  7. 【加密解密】单表加密(Javascript实现)

    2019独角兽企业重金招聘Python工程师标准>>> ■单表加密(monoalphabetic) 替换加密是密码学中按规律将文字加密的一种方式.替换加密中可以用不同字母数为一单元, ...

  8. MySQL单表恢复方法

    正休息的时候一个电话将我的睡意完全打散,"开发童鞋写update SQL的时候忘了加where条件了",相信每一个DBA同学听到这个消息的时候都有骂街的冲动吧.万幸只是单表写花了, ...

  9. MySQL 单表百万数据记录分页性能优化

      来源:一颗卤蛋 链接:http://www.cnblogs.com/lyroge/p/3837886.html 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Goog ...

最新文章

  1. 近期AI领域8篇精选论文(附论文、代码)
  2. ubuntu10.10+android 搭建Opencv
  3. mysql三台机群集_MySQL Cluster 3台机器搭建集群环境
  4. mongo笔记 // 一字一句的写下来,工作点滴片段
  5. Docker数据卷(Volume)
  6. 主成分分析具体解释_主成分分析-现在用您自己的术语解释
  7. jboss数据源配置
  8. 谭浩强c语言规范化的指数形式,C语言程序设计谭浩强第四期末复习重点.docx
  9. java 文件树形_java 显示树形文件结构,类似windows的tree命令
  10. Permission denied的解决办法
  11. java l1 l2缓存,Java 两级缓存框架
  12. libreoj #514. 「LibreOJ β Round #2」模拟只会猜题意
  13. 【清水值预测】基于 matlab RBF神经网络清水值预测【含Matlab源码 822期】
  14. 威纶通触摸屏可以解密吗_老电工选型威纶通触摸屏时的3大技巧!知道了能帮你省事不少...
  15. 个人工作资源(不断更新)
  16. c语言中 小数取整函数,取整函数,截去小数取整函数
  17. Java基础每日一练—第5天:预测身高案列
  18. IDEA中修改项目与Moudle名称方法总结
  19. (16)万能查询还是万恶查询?
  20. 计算机网卡更改mac地址,Mac电脑网卡MAC地址修改的具体步骤

热门文章

  1. Oracle 入门初学者安装(一)。
  2. 师董正伟:商务部受理微软涉垄断案
  3. 西门子行贿门情报列表,我自己写的一个小软件自动搜集到的。
  4. 高德地图3D轨迹回放 + 视野跟随功能
  5. 聚观早报 | 特斯拉上海工厂被曝停产;富士相机X-Pro 3已停产
  6. 前端实现搜索功能和模糊查询
  7. 利用Navicat Premium导出数据库表结构信息至Excel
  8. 寒假ACM假期总结 (7)
  9. C语言水洼数算法,水洼的数量算法 代码(C)
  10. Week3 Syntactic Parsing(句法分析)