数据库操作在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中的数据库操作的更多相关文章

  1. Python框架学习之Flask中的常用扩展包

    Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-scr ...

  2. Python框架学习之Flask中的蓝图与单元测试

    因为Flask框架的集成度很低,随着Flask项目文件的增多,会导致不太好管理.但如果对一个项目进行模块化管理的,那样子管理起来就会特别方便.而在Flask中刚好就提供了这么一个特别好用的工具蓝图(B ...

  3. Python框架学习之Flask中的视图及路由

    在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...

  4. Python框架学习之Flask中的Jinja2模板

    前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...

  5. Spring框架学习10——JDBC Template 实现数据库操作

    为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件. 1.添加依赖 添加Spring核心依赖,MySQL驱动 <!--Spring核心基础依赖--> ...

  6. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  7. android中的数据库操作(转)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  8. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  9. CI中的数据库操作以及AR连贯操作

    要使用CI中的数据库操作,首先我们应该在CI的 application/config/databass.php 文件中配置数据库信息,通常就是配置主机名,用户名,密码,数据库名,表前缀(dbprefi ...

随机推荐

  1. Angular6 组件树结构优化

    本片博客主要是记录实际项目开发中使用Angular6框架,遇到的一个问题. 现象: Angular6框架写的前端web网页,在实际部署运行过程中遇到了一种现象,引入懒加载以后,加载登录面速度很快,但是 ...

  2. iOS ----------怎么修改xcode默认打开方式

    很简单就能解决:选中文件,右键,显示简介,打开方式,选择8.2.然后打钩.

  3. Android为TV端助力 fragment 的用法以及与activity的交互和保存数据的方法,包括屏幕切换(转载)!

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 1.管理Fragment回退栈 类似与Android系统为Acti ...

  4. Python 魔法方法简介

    1.什么是魔法方法? 魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一 ...

  5. C#核心基础--静态类&部分类

    静态类 用 static 关键字修饰的类叫做静态类,静态类通常用来定义工具类.静态类不能实例化,不能从指定基类继承而来,静态类隐式从 Object 类继承而来.静态类只能包含静态成员和常量,因为常量是 ...

  6. mysql中导入导出sql文件

    1.导出整个数据库: mysqldump -u用户名 -p密码 数据库名 > 导出的文件名 例:mysqldump -uroot -proot user > user.sql 2.导出一个 ...

  7. IPerf——网络测试工具介绍与源码解析(4)

    上篇随笔讲到了TCP模式下的客户端,接下来会讲一下TCP模式普通场景下的服务端,说普通场景则是暂时不考虑双向测试的可能,毕竟了解一项东西还是先从简单的情况下入手会快些. 对于服务端,并不是我们认为的直 ...

  8. 排序算法之冒泡排序的思想以及Java实现

    1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称 ...

  9. Linux 小知识翻译 - 「编译器和解释器」

    这次聊聊「编译器和解释器」. 编程语言中,有以C为代表的编译型语言和以Perl为代表的解释型语言.不管是哪种,程序都是以人类能够理解的形式记录的,这种形式计算机是无法理解的. 因此,才会有编译器和解释 ...

  10. Lingo求解线性规划案例3——混料问题

    凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/  某糖果厂用原料A.B和C按不向比率混合加工而成甲.乙.丙三种糖果(假设混合加工中不损耗原料).原料A.B.C ...