数据库学习

@(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没有hostnameusername, 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数据库学习相关推荐

  1. Python Flask教程学习03

    书接上文Python Flask教程学习02 文章目录 Flask 教程 Flask 邮件(Flask-Mail) Flask Mysql及Flask SQLAlchemy 创建数据表 插入数据 查询 ...

  2. Flask框架学习整理——从零开始入门Flask

    文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...

  3. linux数据库创建score表,MySQL数据库学习笔记

    MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...

  4. 简单分析Flask 数据库迁移详情

    本文给大家分享的是 Flask 数据库迁移详情,db.create_all()不会重新创建表或是更新表,需要先使用db.drop_all()删除数据库中所有的表之后再调用db.create_all() ...

  5. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. 数据库学习day_01:SQL的发展和数据库操作相关sql语句

    1.数据库 学习数据库主要学习的就是如何对数据进行增删改查操作. 增加(插入数据) 删除数据 修改数据 查询数据 为什么使用数据库软件? 之前在webserver时通过IO技术已经操作过数据,其实这部 ...

  7. mysql选定数据库_mysql数据库学习――2,数据库的选定,创建,删除和变更_MySQL...

    bitsCN.com mysql数据库学习--2,数据库的选定,创建,删除和变更 数据库选定,数据库选定后依然可以使用其他数据库中的数据表,只要指定[数据库.数据表]即可 use db_namesel ...

  8. mysql 数据库学习(触发器)

    引用:http://bbs.mysql.cn/thread-9135-1-2.html 引用:21. 触发程序 create table a (sa int); create table b (sb ...

  9. mysql now str,数据库学习之MySQL (十)—— 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE...

    MySQL学习专栏 正在持续更新中:) 文章目录 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE 下章预告 日期和时间函数 NOW ...

最新文章

  1. 交换机的VACL测试
  2. Android面试题目之(9) 幽灵引用
  3. C语言数据类型转换详解
  4. Linux服务器SSH免密登录
  5. IIS------项目配置到IIS后报500错误
  6. oracle yum 本地源,Linux YUM本地源配置
  7. 解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题
  8. SVN客户端安装详细教程
  9. 打造全自动的NOD32升级服务器
  10. 专家视点:杜绝木马的干扰-防范后门的技巧(转)
  11. w10系统服务器管理器,Win10如何打开服务管理器
  12. Module parse failed Unexpected token
  13. 中图杯获奖作品计算机组,中图杯大赛试卷
  14. 【vim环境配置】详细实录
  15. android内存置换,安卓手机64GB内存如何更换内存
  16. 无损压缩——Huffman编码
  17. wamp打开php,wamp本地php环境开启GD库教程
  18. matlab电解电容在哪,基于MATLAB的电容器直流局部放电检测.pdf
  19. 氚云根据后台返回数据写下拉框
  20. 编程世界,我的世界。

热门文章

  1. (四)使用OpenCV实现图像彩色模型转换
  2. Halcon/MFC混合编程入门
  3. 机器学习:单变量线性回归及梯度下降
  4. c语言编程变色,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...
  5. unix linux 安装mono,关于mono在linux连接unixodbc的问题
  6. myisam为什么比innodb查询快_mysql存储引擎之MyISAM 和 InnoDB的比较
  7. 安阳学院有几次计算机考试,安阳:2017年上半年全国计算机等级考试顺利结束...
  8. 查看mysql5.7默认密码_mysql-5.7安装部署+MySQL5.7初始密码查看及重置
  9. python 返回函数 闭包_python中闭包Closure函数作为返回值的方法示例
  10. python与c 交互原理_PYTHON 与C相互交互调用实例解析