Flask数据库学习
数据库学习
@(Flask)
- 关系型数据库(SQL数据库)
- 文档数据库和键值对数据库 (NoSQL)
SQL数据库
表是关键。用表可以模拟程序中不同的实体。
- 主键:各行的唯一标识符。
- 外键:引用同一个表或不同表中的某行的主键。
表的列是固定的,所以这个可以对应到程序中的属性值。
关系型数据库复杂的地方在于联表查询。
NoSQL数据库
一般使用集合代替表。
使用文档代替记录。
NoSQL的设计方式使得联结变得困难。
所以NoSQL的设计很多地方需要反规范化操作,才能保证效率,但是数据重复是难以避免的了。
SQL or NoSQL
SQL数据库擅长处理:高效且紧凑的形式存储结构化数据。这种数据库需要花费大量精力保证数据库的一致性。
NoSQL数据库:放宽了对一致性的要求,获得了性能上的优势。
划重点:中小程序来说,SQL和NoSQL数据库都OK,且性能相当。
Python的数据库框架
Flask不限制使用何种类型的数据库包。
- MySQL
- Postgres
- SQLite
- Redis
- MonogoDB
- CouchDB
这些具体的数据库包。
数据库抽象层代码包
- SQLAlchemy
- MongoEngine
通过这些包可以处理高等级的Python对象。
选择考量因素
- 易用性:将高层的面向对象的操作转换为数据路指令。
- ORM : 对象关系映射
- ODM:对象文档映射
- 性能
- 可移植性
- Flask集成度:专门为Flask开发的扩展是首选。
Flask-SQLAlchemy
强大的关系型数据库框架。且提供了ORM,也有原生的SQL功能。
安装:pip install flask-sqlalchemy
数据库URL:
- MySQL :
mysql://username:password@hostname/database
- Postgres :
postgresql://username:password@hostname/database
- SQLite(Unix) :
sqlite:absolute/path/to/database
- SQLite(Windows) :
sqlite:///c:/absolute/path/to/database
以MySQL为例,hostname是MySQL服务所在的主机。
可以是:
- localhost
- 远程服务器
数据库服务器上可以托管多个数据库,所以要指定databasename
。
可以看到SQLite没有hostname
,username
, password
,因为SQLite不用服务器,是本地的数据库服务,安卓手机就用的是SQLite数据库。
from flask_sqlalchemy import SQLAlchemy #引入数据库管理包
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir,'data.sqlite')
db = SQLAlchemy(app)
db是SQLAlchemy类实例,表示的就是程序使用的数据库,通过db可以获得SQLAlchemy提供的所有功能。
定义模型
模型的含义:程序使用的持久化实体。
一般来说,数据库的天然属性就是持久化。
ORM下,模型是一个Python类,类的属性对应到数据库表中的列。
SQLAlchemy创建的数据库实例为模型提供了:
- 一个基类
- 一系列辅助类和辅助函数
用于定义模型的结构。
#定义模型
class Role(db.Model):__tablename__ = 'roles'id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(64),unique=True)def __repr__(self):return '<Role %r>' % self.name
类变量__tablename__
定义在数据库中说那个的表名。
db.Column()
类构造函数参数:
- 第一个参数是数据库列和模型属性的类型
- 第二个参数是可选配置选项
第一个参数类型不列举了,重点看第二个可选参数。
- primary_key 设置为True,表示这是主键
- unique 设置为True,表示这列不允许出现重复的值
- index 设置为True,为这列创建索引,提升查询效率
- nullable 设置为True,允许使用空值,反之,不允许用空值
- default 定义默认值
__repr__()
函数返回一个具有可读性的字符串表示模型,用于调试和测试。
关系
关系型数据库使用关系将不同的表中的行联系起来。
#在Role类中定义
users = db.relationship('User',backref='role')
#role_id位于users表中,这个是外键
role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
db.relationship()
第一个参数表明这个关系的另一端是哪个模型,如果模型尚未定义,可使用字符串形式执行。
backref
参数向User
模型中添加一个role
属性。从而定义反向关系:通过这个属性可以替代role_id
访问Role模型。此时可以获取的是模型对象,不是外键的值。
注:关于反向关系的理解,可以点击参考相关解释。
定义关系时常用的配置选项:
- backref : 在关系的另一个模型中添加反向引用
- primaryjoin : 明确指定两个模型之间使用的联结条件,只在模棱两可的关系中需要指定。
- lazy : 指定如何加载相关记录。可选值有:
select
首次访问时按需加载immediate
源对象加载后就加载joined
加载记录但使用联结subquery
立即加载,但使用子查询noload
永不加载dynamic
不加载记录,但提供加载记录的查询
- uselist 若设为false,不使用列表,而使用标量值
- order_by 指定关系中记录的排序方式
- secondary 指定多对关系中关系表的名字
- secondaryjoin SQLAlchemy无法自行决定时,指定多对多关系中的二级联结条件
注:上面这些不是特别清晰,需要在实例中阐述。
创建表
- 根据模型创建数据库
方法:db.create_all()
函数
python hello.py shell
>>> from hello import db
>>> db.create_all()
删除旧表:db.drop_all()
插入行
#同样在shell下
>>> from hello import Role, User
>>> admin_role = Role(name='Admin')
>>> mod_role = Role(name='Moderator')
>>> user_role = Role(name='User')
>>> user_john = User(username='john',role=admin_role)
>>> user_susan = User(username='susan',role=user_role)
修改行
>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()
删除行
>>> db.session.delete(mod_role)
>>> db.session.commit()
查询行
SQLAlchemy为每个模型类都提供给了query对象。
最基本的查询是:Role.query.all()
将返回表中的所有记录。
自然这个是很粗糙的,需要加条件过滤。
过滤器
进行更精确的数据库查询。
User.query.filter_by(role=user_role).all()
可以很方便查询SQLAlchemy生成的原生SQL查询语句:
>>> str(User.query.filter_by(role=user_role))
将得到原生的SQL语句。
常用过滤器
- filter() 将过滤器添加到原查询,返回一个新查询
- filter_by() 把等值过滤器加到原查询上,返回一个新查询
- limit() 使用指定的值限制原查询返回的结果数量,返回一个新查询
- offset() 偏移查询返回的结果,返回一个新查询
- order_by() 根据指定条件对远程讯结果进行排序,返回一个新查询
- group_by() 根据指定条件对元查询结果进行分组,返回一个新查询
指定过滤器后,通过调用all()
执行查询。
当然也有其他触发执行方法:
- all() 以列表形式返回查询的所有结果
- first() 返回查询的第一个结果,如果没有则返回None
- first_or_404() 返回查询的第一个结果,如果没有就终止请求,返回404错误响应
- get() 返回指定主键对应的行,没有则返回None
- get_or_404()
- count() 返回查询结果的数量
- paginate() 返回一个Pagniate对象,包含指定范围内的结果
视图函数中操作数据库
语法与上面在终端的用法相同。
集成Python shell
每次启动shell会话需要导入数据库实例和模型,为了避免重复,做些配置即可。
from flask_script import Shell
def make_shell_context():return dict(app=app, db=db, User=User, Role=Role)
manager.add_command("shell",Shell(make_context=make_shell_context))
用Flask-Migrate实现数据库迁移
用到再详谈。
Flask数据库学习相关推荐
- Python Flask教程学习03
书接上文Python Flask教程学习02 文章目录 Flask 教程 Flask 邮件(Flask-Mail) Flask Mysql及Flask SQLAlchemy 创建数据表 插入数据 查询 ...
- Flask框架学习整理——从零开始入门Flask
文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...
- linux数据库创建score表,MySQL数据库学习笔记
MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...
- 简单分析Flask 数据库迁移详情
本文给大家分享的是 Flask 数据库迁移详情,db.create_all()不会重新创建表或是更新表,需要先使用db.drop_all()删除数据库中所有的表之后再调用db.create_all() ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 数据库学习day_01:SQL的发展和数据库操作相关sql语句
1.数据库 学习数据库主要学习的就是如何对数据进行增删改查操作. 增加(插入数据) 删除数据 修改数据 查询数据 为什么使用数据库软件? 之前在webserver时通过IO技术已经操作过数据,其实这部 ...
- mysql选定数据库_mysql数据库学习――2,数据库的选定,创建,删除和变更_MySQL...
bitsCN.com mysql数据库学习--2,数据库的选定,创建,删除和变更 数据库选定,数据库选定后依然可以使用其他数据库中的数据表,只要指定[数据库.数据表]即可 use db_namesel ...
- mysql 数据库学习(触发器)
引用:http://bbs.mysql.cn/thread-9135-1-2.html 引用:21. 触发程序 create table a (sa int); create table b (sb ...
- mysql now str,数据库学习之MySQL (十)—— 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE...
MySQL学习专栏 正在持续更新中:) 文章目录 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE 下章预告 日期和时间函数 NOW ...
最新文章
- 交换机的VACL测试
- Android面试题目之(9) 幽灵引用
- C语言数据类型转换详解
- Linux服务器SSH免密登录
- IIS------项目配置到IIS后报500错误
- oracle yum 本地源,Linux YUM本地源配置
- 解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题
- SVN客户端安装详细教程
- 打造全自动的NOD32升级服务器
- 专家视点:杜绝木马的干扰-防范后门的技巧(转)
- w10系统服务器管理器,Win10如何打开服务管理器
- Module parse failed Unexpected token
- 中图杯获奖作品计算机组,中图杯大赛试卷
- 【vim环境配置】详细实录
- android内存置换,安卓手机64GB内存如何更换内存
- 无损压缩——Huffman编码
- wamp打开php,wamp本地php环境开启GD库教程
- matlab电解电容在哪,基于MATLAB的电容器直流局部放电检测.pdf
- 氚云根据后台返回数据写下拉框
- 编程世界,我的世界。
热门文章
- (四)使用OpenCV实现图像彩色模型转换
- Halcon/MFC混合编程入门
- 机器学习:单变量线性回归及梯度下降
- c语言编程变色,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...
- unix linux 安装mono,关于mono在linux连接unixodbc的问题
- myisam为什么比innodb查询快_mysql存储引擎之MyISAM 和 InnoDB的比较
- 安阳学院有几次计算机考试,安阳:2017年上半年全国计算机等级考试顺利结束...
- 查看mysql5.7默认密码_mysql-5.7安装部署+MySQL5.7初始密码查看及重置
- python 返回函数 闭包_python中闭包Closure函数作为返回值的方法示例
- python与c 交互原理_PYTHON 与C相互交互调用实例解析