本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Python+MySQL数据库程序设计入门教程》、《Python常见数据库操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]