Python框架Flask的基本数据库操作方法分析


Posted in Python onJuly 13, 2018

本文实例讲述了Python框架Flask的基本数据库操作方法。分享给大家供大家参考,具体如下:

数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中。如用户名、密码等等其他信息。Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类,可以在文件中直接继承过来。但是在Flask中,并没有把Model类封装好,需要使用一个扩展包,Flask-SQLAlchemy。它是一个对数据库的抽象,让开发者不用这些编写SQL语句,而是使用其提供的接口去操作数据库,这其中涉及到一个非常重要的思想:ORM什么是ORM呢?下面我们就来详细讲解一下。

一、ORM

1. ORM的全称是:Object Relationship Map:对象-关系映射。主要的功能是实现模型对象到关系型数据库数据的映射。说白了就是使用通过对象去操作数据库。

2. 操作过程图:

Python框架Flask的基本数据库操作方法分析

3. 优点:

(1). 不需要编写SQL代码,这样可以把精力放在业务逻辑处理上。

(2). 使用对象的方式去操作数据库。实现数据模型与数据库的解耦,利于开发。

4. 缺点:

性能较低。

二、Flask-SQLAlchemy的介绍

1. 设置配置信息

在开发中,一般是把一些配置信息都写在一个单独的文件中,如settings.py。这样一些安全信息就可以得到保存!

重点字段有:

数据库的指定是使用URL的方式来指定的:'mysql://用户名:密码@服务器地址:端口号/数据库名',但是连接SQLite是使用这用格式:sqlite:////absolute/path/to/foo.db,使用////开头

SQLALCHEMY_DATABASE_URI = 'myslq://root:meiyou@127.0.0.1:3306/test'
SQLALCHEMY_POOL_RECYCLE:设置多少秒后自动回收连接,对MySQL来说,默认是2小时
SQLALCHEMY_ECHO:设置True的话,查询时会显示原始SQL语句。
SQLALCHEMY_TRACK_MODIFICATIONS:动态追踪修改设置。

2. 常用的SQLAlchemy字段类型:

Integer
String
Numberic
Boolean
Date

3. 常用的SQLAlchemy列选项

primary_key:如果为True,表示主键。Flask中没有自动生成主键,需要自定义。
unique:为True,设置该列不能有重复值,如用户名、邮箱、手机号
nullable:为True的话可以为null
default:设置默认值
index:为True,设置该列为索引,默认索引是主键。

4. 关系选项

backref:在关系的另一模型中添加的反向引用,查询时起很大作用。
secondary:用于多对多关系中表的名字
primary join

三、Flask-SQLAlchemy的基本操作

在Flask-SQLAlchemy中的增、删、改操作是由数据库会话(db.session)管理的。也就是说,在准备把数据写入数据库前,要先将数据添加(add())到会话中,然后使用commit()提交会话。

在Flask-SQLAlchemy中的查询操作都是通过query对象操作数据库。基本的查询是返回表中的所有数据,还可以使用过滤器进行更精确的数据库查询。

1. 常用查询过滤器:

过滤器得到的还只是一些对象,需要使用执行器来获取真正的数据。

filter(): 把过滤器添加到原查询上,返回一个新查询,需要使用模型类名去获取字段来进行比较。
filter_by():把等值(只能使用=比较操作)过滤器添加到查询上,返回一个新查询。
order_by():根据指定条件对查询结果进行排序,返回一个新查询。
group_by():根据指定条件对原查询结果进行分组,返回一个新查询。

2. 常用查询执行器

all():以列表的形式返回查询的所有结果
first():返回查询的第一个结果,
first_or_404():同first(), 只不过如果没有找到的话,返回404错误
get():返回指定主键对应的行,
get_or_404():返回指定主键对应的行,如不存在,返回404错误
count():返回查询结果的数量
paginate():返回一个Paginate对象,包含指定范围内的结果。

3. 查询条件

startswith('xx'):查询以xx开头的所有数据
endswith('xx'):查询以xx结尾的所有数据
not_():取反
and_():返回and()条件满足的所有数据
or_():返回or()条件满足的所有数据

示例:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from settings import Config
app = Flask(__name__)
app.config.from_object(Config)
# 创建数据库实例对象
db = SQLAlchemy(app)
class Role(db.Model):
  """创建角色模型类"""
  __tablename__ = 'roles'
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(64), unique=True)
  # 描述roles表和users表的关系,
  # 第一个参数为多那端的模型类名
  # 第二个参数backref:为模型类名声明新属性,这样就可以实现反向查询
  # 第三个参数决定了什么时候从数据库中查询数据
  us = db.relationship('User', backref='role', lazy='dynamic')
  def __repr__(self):
    return 'Role:%s' % self.name
class User(db.Model):
  """创建用户模型类"""
  # 设置表名
  __tablename__ = 'users'
  # 添加主键
  id = db.Column(db.Integer, primary_key=True)
  # 用户名
  name = db.Column(db.String(30), unique=True)
  email = db.Column(db.String(64), unique=True)
  password = db.Column(db.String(64))
  # 定义一个外键
  role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
  def __repr__(self):
    return 'User:%s' % self.name
if __name__ == '__main__':
  # 先删除表
  db.drop_all()
  # 创建表
  db.create_all()
  # 添加数据
  app.run()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python基于dom操作xml数据的方法示例
May 12 Python
python2 与 python3 实现共存的方法
Jul 12 Python
Python中return self的用法详解
Jul 27 Python
Python列表生成式与生成器操作示例
Aug 01 Python
python障碍式期权定价公式
Jul 19 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
python实现学生管理系统开发
Jul 24 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 Python
Python使用pickle模块实现序列化功能示例
Jul 13 #Python
mac下如何将python2.7改为python3
Jul 13 #Python
Python面向对象程序设计之继承与多继承用法分析
Jul 13 #Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 #Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 #Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 #Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 #Python
You might like
PHP 编程的 5个良好习惯
2009/02/20 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
jquery multiSelect 多选下拉框
2010/07/09 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
0基础学习前端开发的一些建议
2020/07/14 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
python实现二维插值的三维显示
2018/12/17 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
python 实现线程之间的通信示例
2020/02/14 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
主婚人致辞精选
2015/07/28 职场文书
小学记事作文之200字
2019/08/06 职场文书