关键词:
数据模型
数据库回顾
- 分类:
- 关系型数据库:MySQL、sqlite、…
- 非关系型数据库:Redis、MongoDB、…
- 操作:
- 执行原生SQL语句,每次都需要拼接SQL语句,非常繁琐而且特别容易出错。
- ORM(对象关系映射),使用ORM可以通过对对象的操作完成对数据库的操作。
flask-sqlalchemy
-
说明:其实是sqlalchemy扩展库在flask中的移植库,通过了绝大多数关系型数据库的支持(ORM)
-
安装:
pip install flask-sqlalchemy
-
连接地址配置:
- 名称:
SQLALCHEMY_DATABASE_URI
- 格式:
- sqlite:
sqlite:/// + 数据库文件名
- MySQL:
数据库名+驱动名://用户名:密码@主机:端口/数据库
- sqlite:
- 名称:
-
使用:
# 配置数据连接地址 base_dir = os.path.dirname(__file__) database_uri = ‘sqlite:///‘ + os.path.join(base_dir, ‘data.sqlite‘) app.config[‘SQLALCHEMY_DATABASE_URI‘] = database_uri # 禁止数据的修改追踪(需要消耗资源) app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = False # 创建数据库操作对象 db = SQLAlchemy(app) # 设计模型类 class User(db.Model): # 表名默认会将模型名转为小写加下划线的形式 # 如:UserModel => user_model # 指定表名 __tablename__ = ‘users‘ id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20), unique=True) email = db.Column(db.String(32), unique=True)
-
数据表操作
@app.route(‘/create/‘) def create(): # 创建数据表 db.create_all() return ‘数据表已创建‘ @app.route(‘/drop/‘) def drop(): db.drop_all() return ‘数据表已删除‘ # 添加终端命令,完成数据表的创建 @manager.command def createall(): # 先删除原来的,副作用很大 db.drop_all() # 然后再创建 db.create_all() return ‘数据表已创建‘ # 添加终端命令,完成数据表的删除 @manager.command def dropall(): if prompt_bool(‘您确定要删库跑路吗?‘): db.drop_all() return ‘数据表已删除‘ return ‘删库有风险,操作需谨慎!‘
执行终端命令:python manage.py createall,即可创建数据表
数据库迁移
-
说明:将数据模型的更改应用到数据表的操作叫数据库迁移。
flask-migrate
就是专门做迁移的扩展库。 -
安装:
pip install flask-migrate
-
使用:
from flask_migrate import Migrate # 创建数据库迁移对象 migrate = Migrate(app, db) # 将迁移命令添加到终端 manager.add_command(‘db‘, MigrateCommand)
-
迁移:
- 初始化,只需要一次,创建用户存放迁移脚本的目录及相关文件。
python manage.py db init
- 根据数据模型与数据表,生成迁移脚本。
python manage.py db migrate
- 执行迁移脚本
python manage.py db upgrade
-
提示:
- 初始化操作只需要一次,以后生成迁移脚本与执行迁移脚本循环执行即可完成数据库的迁移。
- 不是每次迁移都会成功,迁移出错时需要手动解决。
CURD操作
-
增加数据
# 设置自动提交操作,请求结束时无论如何都会提交 app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True # 增加数据 @app.route(‘/insert/‘) def insert(): # 创建对象 # jie = User(name=‘八戒‘, email=‘[email protected]‘, age=30) # hou = User(name=‘猴哥‘, email=‘[email protected]‘, age=20) # 保存到数据库,只能保存一条数据 # db.session.add(hou) bei = User(name=‘贝贝‘, email=‘[email protected]‘, age=28) jing = User(name=‘晶晶‘, email=‘[email protected]‘, age=18) huan = User(name=‘欢欢‘, email=‘[email protected]‘, age=22) ying = User(name=‘迎迎‘, email=‘[email protected]‘, age=23) ni = User(name=‘妮妮‘,email=‘[email protected]‘, age=20) # 保存到数据库,一次性保存多条数据 db.session.add_all([bei, jing, huan, ying, ni]) # 提交操作,若没有设置自动提交,每次执行操作都需要手动提交一次 # db.session.commit() return ‘数据已添加‘
-
查询数据
# 查询操作 @app.route(‘/select/<uid>/‘) def select(uid): # 根据主键进行查询,找到返回对象,没找到返回None user = User.query.get(uid) if user: return user.name return ‘查无此人‘
-
修改数据
# 修改数据 @app.route(‘/update/<uid>/‘) def update(uid): user = User.query.get(uid) if user: user.email = ‘[email protected]‘ # 再次添加到数据库即可 db.session.add(user) return ‘数据已修改‘ return ‘查无此人‘
-
删除数据
# 删除数据 @app.route(‘/delete/<uid>/‘) def delete(uid): user = User.query.get(uid) if user: db.session.delete(user) return ‘数据已删除‘ return ‘查无此人‘
模型设计参考
-
常见的字段类型
字段类型 python类型 说明 Integer int 整型(32) SmallInteger int 整型(16) BigInteger int/long 整型(64) Float float 浮点型 String str 变长字符串 Text str 不受限制的文本 Boolean bool 布尔值,True/False Date datetime.date 日期 Time datetime.time 时间 DateTime datetime.datetime 日期时间 Interval datetime.timedelta 时间间隔 PickleType pickle.dumps() 使用pickle模块序列化后的python对象 LargeBinary bytes 任意大的二进制数据 -
常见字段选项
选项 说明 primary_key 是否作为主键索引,默认为False autoincrement 是否设置字段自增,默认为False unique 是否作为唯一索引,默认为False index 是否作为普通索引,默认为False nullable 字段是否可以为空,默认为True default 设置默认值 -
总结:
- 插入数据可以不传值的情况:自增的字段、可以为空的字段、有默认值的字段
- 使用flask-sqlalchemy时每个模型都需要有一个主键,通常主键字段名称为id
- 数据模型类名与数据表中的名字
- 默认:会将模型名转换为小写加下划线的方式,如:
UserModel => user_model
- 指定:通过类属性
__tablename__
指定表名
- 默认:会将模型名转换为小写加下划线的方式,如:
各种查询
-
说明:在数据库的操作中,绝大多数都是查询操作,而且这些操作都是通过方法来实现的。
-
常见操作:
操作 说明 get 根据主键查询,查到返回对象,没查到返回None get_or_404 根据主键查询,查到返回对象,没查到报404错 first 返回第一条数据,没有时返回None first_or_404 返回第一条数据,没有时报404错 all 查询所有数据组成的列表 limit 限制结果集数量,返回时查询对象 offset 结果集偏移数量,返回时查询对象 order_by 排序,指定字段后,默认按升序排序(asc),降序(desc),可以指定多个字段 count 统计个数 -
聚合函数:
max、min、sum、avg、count
from sqlalchemy import func @app.route(‘/query/‘) def query(): # 聚合函数 # max_age = db.session.query(func.max(User.age)).scalar() max_age = db.session.query(func.min(User.age)).scalar() return str(max_age)
-
指定条件查询
@app.route(‘/query/‘) def query(): # 指定等值条件 # users = User.query.filter_by(age=18).all() # 指定任意条件 users = User.query.filter(User.age > 18).all() return ‘,‘.join(u.name for u in users)
filter条件查询
-
关系
>, __gt__:大于 示例: # users = User.query.filter(User.age > 20).all() # 等价于上式 users = User.query.filter(User.age.__gt__(20)).all() >=,__ge__:大于等于 <, __lt__:小于 <=,__le__:小于等于 ==,__eq__:等于 !=,__ne__:不等于
-
范围
users = User.query.filter(User.id.between(1, 3)).all() users = User.query.filter(User.id.in_((1, 3, 5))).all() users = User.query.filter(User.id.notin_((1, 3, 5))).all()
-
内容
# 包含指定内容 # users = User.query.filter(User.email.contains(‘ng‘)).all() # 以指定内容开头 # users = User.query.filter(User.email.startswith(‘fe‘)).all() # 以指定内容结尾 # users = User.query.filter(User.email.endswith(‘.com‘)).all() # 模糊匹配 # users = User.query.filter(User.email.like(‘l%‘)).all() users = User.query.filter(User.email.notlike(‘l%‘)).all()
-
逻辑
from sqlalchemy import and_, or_ # 默认的关系就是逻辑与 # users = User.query.filter(User.id > 3, User.age > 20).all() # 与上式等价 # users = User.query.filter(and_(User.id > 3, User.age > 20)).all() # 逻辑或 users = User.query.filter(or_(User.id > 3, User.age > 20)).all()
?
一周掌握flask框架学习笔记flask中使用数据库(使用flask-sqlalchemy管理数据库)(代码片段)
Flask中使用数据库Flask-SQLAlchemy扩展SQLALchemy实际上是对数据库的抽象,让开发者不用直接和SQL语句打交道,而是通过Python对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升SQLAlchemy是一... 查看详情
一周掌握flask框架学习笔记flask概念及基础(代码片段)
Flask概念及基础为什么要用Web框架Web应用程序的本质使用WEB框架的优点Flask简介:Flask与Django对比框架之间的差别Flask安装环境1、创建目录用来存放虚拟环境2、打开~/.bashrc文件,并添加如下:3、运行4、进入虚拟环境5... 查看详情
一周掌握flask框架学习笔记flask概念及基础(代码片段)
Flask概念及基础为什么要用Web框架Web应用程序的本质使用WEB框架的优点Flask简介:Flask与Django对比框架之间的差别Flask安装环境1、创建目录用来存放虚拟环境2、打开~/.bashrc文件,并添加如下:3、运行4、进入虚拟环境5... 查看详情
Flask - 拉取实时流 kafka 数据 - 将 Kafka 与 Python Flask 集成
...lask-Pullingthelivestreamkafkadata-IntegratingKafkawithPythonFlask【发布时间】:2016-05-1502:25:56【问题描述】:这个项目是为了realtimesearchengine-loganalysis的性能。我有一个从Spark处理到Kafka的实时流数据。现在有了Ka 查看详情
如何让 Flask SQLAlchemy 重用数据库连接?
...【英文标题】:HowdoImakeFlaskSQLAlchemyreusedbconnections?【发布时间】:2012-05-2317:40:49【问题描述】:我似乎无法让我的Flask应用程序关闭或重用数据库连接。我正在使用PostgreSQL9.1.3和Flask==0.8Flask-SQLAlchemy==0.16psycopg2==2.4.5当我的测试套件... 查看详情
flaskpost请求,数据入库,文件上传,一文看懂,3天掌握flask开发项目系列博客之三(代码片段)
flask实现ajax数据入库在正式编写前需要了解一下如何在python函数中去判断,一个请求是get还是post。python文件代码如此所示:#route()方法用于设定路由;@app.route('/hello.html',methods=['GET','POST'])defhell... 查看详情
【python基础】flask是啥意思?
...板引擎),都是很容易替换。除此之外的一切都由可由你掌握。默认情况下,Flask不包含数据库抽象层、表单验证,或是任何已在其它已库中处理的很好的功能。相反,Flask支持通过扩展来给应用添加这些功能,如同是Flask本身实... 查看详情
flask(代码片段)
...模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask可以与您珠联璧合。默认情况下,Flask不包 查看详情
flask框架——flask简介(代码片段)
...模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask可以与您珠联璧合。默认情况下,Flask不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask支持用扩展来给应用添加这... 查看详情
flask05cookie
...问我这个网站的时候,你会把之前我存放到你浏览器中的数据带回来给我 你要先登录(用户名、密码)-> 我作为后台,会将能够唯一识别你的信息数据存在你的浏览器中 ->... 查看详情
用普通的peewee模块替换flask_peewee.db?
...【英文标题】:Replaceflask_peewee.dbwithplainpeeweemodule?【发布时间】:2016-03-2307:55:15【问题描述】:我有一个烧瓶应用程序,它在其应用程序模块中使用了flask_peewee.db:fromflask_peewee.dbimportDatabase是否可以用普通peewee模块替换flask_peewee... 查看详情
一周掌握flask框架学习笔记flask项目部署(使用gunicorn和nginxuwsgi和nginx两种部署方式)(代码片段)
部署一.使用gunicorn和nginx部署当我们执行下面的hello.py时,使用的flask自带的服务器,完成了web服务的启动。在生产环境中,flask自带的服务器,无法满足性能要求,我们这里采用Gunicorn做wsgi容器,来部署flas... 查看详情
如何在本地 Flask 环境中自动使用生产 postgres 数据库备份
...omateusingaproductionpostgresdatabasebackupinlocalFlaskenvironment【发布时间】:2021-05-0709:13:31【问题描述】:我们的网站使用Postgres和Flask,并且我们经常在本地使用生产数据库转储。为了获得新的转储,我使用远程桌面连接(RDC)连接到pgAdmin 查看详情
flask总结(代码片段)
...模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask可以与您珠联璧合。默认情况下,Flask不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask支持用扩展来给应用添加这... 查看详情
使用 Flask 和 MySQL 创建事件管理器
...器【英文标题】:CreatinganeventsmanagerusingFlaskandMySQL【发布时间】:2018-05-1522:15:57【问题描述】:我是一名Python和Javascript程序员新手,目前正在使用Flask和MySQL创建一个事件管理器应用程序。单页网站应允许用户:添加和查看事件... 查看详情
无法在 FLASK 中连接 2 个应用程序
...2个应用程序【英文标题】:Unabletoconnect2AppsinFLASK【发布时间】:2021-05-0912:53:23【问题描述】:我在FLASK中创建了2个应用程序,一个应用程序将发出GET请求并提取数据,第二个应用程序将从应用程序1获取数据并发出POST请求以将数... 查看详情
python+flask搭建mockapiserver(代码片段)
...,等服务器上线之后,切换server地址,直接可以简化调试时间,缩短项目测试周期;准备工作Python安装Flask安装:pipinstallflaskGet请 查看详情
11.1flask框架介绍(代码片段)
...擎——则很容易替换。除此之外的一切都由可由你掌握。默认情况下,Flask不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask支持用扩展来给应用添加这些功能,如同是Flask本身实现的... 查看详情