侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   190

本文实例讲述了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:[email protected]: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 Flaskfrom flask_sqlalchemy import SQLAlchemyfrom settings import Configapp = 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.nameclass 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.nameif __name__ == '__main__':  # 先删除表  db.drop_all()  # 创建表  db.create_all()  # 添加数据  app.run()

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python+MySQL数据库程序设计入门教程》、《Python常见数据库操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

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


  • 上一条:
    Python for循环中的陷阱详解
    下一条:
    Python使用pickle模块实现序列化功能示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客