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

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框架学习之Flask中的数据库操作的更多相关文章
- Python框架学习之Flask中的常用扩展包
Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-scr ...
- Python框架学习之Flask中的蓝图与单元测试
因为Flask框架的集成度很低,随着Flask项目文件的增多,会导致不太好管理.但如果对一个项目进行模块化管理的,那样子管理起来就会特别方便.而在Flask中刚好就提供了这么一个特别好用的工具蓝图(B ...
- Python框架学习之Flask中的视图及路由
在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...
- Python框架学习之Flask中的Jinja2模板
前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...
- Spring框架学习10——JDBC Template 实现数据库操作
为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件. 1.添加依赖 添加Spring核心依赖,MySQL驱动 <!--Spring核心基础依赖--> ...
- golang学习笔记16 beego orm 数据库操作
golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...
- android中的数据库操作(转)
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 an ...
- android中的数据库操作(SQLite)
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 an ...
- CI中的数据库操作以及AR连贯操作
要使用CI中的数据库操作,首先我们应该在CI的 application/config/databass.php 文件中配置数据库信息,通常就是配置主机名,用户名,密码,数据库名,表前缀(dbprefi ...
随机推荐
- mac svn的使用
一.概述 在windows下,我们常常用TortoiseSVN管理svn代码.在mac下,自带svn客户端和服务器端功能. 二.服务端:创建代码仓库,用来存储客户端所上传的代码 (1)创建svn代码存 ...
- Vue2+VueRouter2+webpack 构建项目实战(一):准备工作
环境准备 首先,要开始工作之前,还是需要把环境搭建好.需要的环境是nodejs+npm,当然现在安装node都自带了npm. 在终端下面输入命令node -v会有版本号出来.就说明安装成功了.输入np ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
- 【读书笔记】iOS-使用GCD改善性能
一,队列简介. 有些与并行处理相关的术语令人迷惑.线程是一个常用的术语,在iOS应用中,线程是标准的POSIX线程.从技术上说,线程不过是一组指令,可在进程中独立地处理:在同一个进程中,可以有多个线程 ...
- 支持MPI的hdf5库的编译
作者:朱金灿 来源:http://blog.csdn.net/clever101 因为最近要研究并行I/O,据说hdf5文件格式可以支持并行I/O,深度学习框架Caffe用的是hdf格式,所以决定把h ...
- iOS----------关于UDID和UUID的一些理解
一.UDID(Unique Device Identifier) UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需要限制一台设备一个账号的应用中经 ...
- web-worker 的使用
JavaScript采用的是单线程模式,它每次也只能执行一个事件,所以它在加载大量的事件的时候会比较慢. 而web-worker的作用就是给JavaScript提供一个多线程的模式. 注意的是 web ...
- DAY3(PYTHON)字符串切片
字符串调整: capitalize() #首字母大写 upper() #全大写 lower() #全小写 swapcase() #大小写翻转 字符串切片: 顾头不顾尾!!! ...
- (网页)jQueryAJAXtimeout超时问题详解(转)
先给大家分析下超时原因: 1.网络不通畅. 2.后台运行比较慢(服务器第一次运行时,容易出现) 超时结果:JQ中 timeout设置请求超时时间. 如果服务器响应时间超过了 设置的时间,则进入 ERR ...
- github仓库本地创建上传远程仓库
1.现在githubu创建自己心意的仓库. 2.然后再本地创建文件夹 echo"# (远程仓库的名字) >>README.md git add README.md git co ...