Flask入门数据库框架flask-SQLAlchemy(十)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: ​ Web程序开发中最重要的莫过于关系型数据库,即SQL 数据库,另外文档数据库(如 mongodb)、键值对数据库(如 redis)慢慢变得流行.原因 : 我们不直接使用这些数据库引擎提供的 Python 包,而是使用对象关系映射(Object-Relational Mapper, ORM)框架,是因为它将低层的数据库操作指令抽象成高层的面向对象操作。

​ Web程序开发中最重要的莫过于关系型数据库,即SQL 数据库,另外文档数据库(如 mongodb)、键值对数据库(如 redis)慢慢变得流行.

原因 : 我们不直接使用这些数据库引擎提供的 Python 包,而是使用对象关系映射(Object-Relational Mapper, ORM)框架,是因为它将低层的数据库操作指令抽象成高层的面向对象操作。也就是说,如果我们直接使用数据库引擎,我们就要写 SQL 操作语句,但是,如果我们使用了 ORM 框架,我们对诸如表、文档此类的数据库实体就可以简化成对 Python 对象的操作。

(1) Flask - SQLAlchemy

Flask使用的ORM框架为 SQLAlchemy,数据库采用了URL指定,下面我们列举几种数据库引擎:

数据库引擎 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

注意:

  1. username 和 password 表示登录数据库的用户名和密码
  2. hostname 表示 SQL 服务所在的主机,可以是本地主机(localhost)也可以是远程服务器
  3. database 表示要使用的数据库 , SQLite 数据库不需要使用服务器,它使用硬盘上的文件名作为 database

ORM使用的优点:

  1. 增加少sql的重复使用率
  2. 使表更加的可读性
  3. 可移植性

(2) SQLAlchemy操作sql原生

安装操作数据库的模块

pip3 install pymysql

安装 flask-sqlalchemy

sudo pip3 install flask-sqlalchemy

配置路径

DB_URI = ‘mysql+pymysql://root:password@host:port/database’

下面先看下sqlalchemy操作的写法:

from sqlalchemy import create_engine

HOST = '127.0.0.1'
USERNAME = 'root'
PASSWORD = '123456'
DATABASE = 'demo'  #数据库名
PORT = 3306
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOST,PORT,DATABASE)
#创建引擎
engine = create_engine(DB_URI)

with engine.connect() as db:
    data = db.execute('select * from user') #从user表中获取全部数据
    db.execute('delete from user where id=1')  #删除id=1的数据

(3) 设计数据表

1 字段类型

类型名 python中的类型 说明
Integer int 存储整形 32位
SmallInteger int 小整形 16为
BigInteger int 大整形
Float float 浮点数
String str 字符串 varchar
Text str 长文本
Boolean bool bool值
Date datetimedate 日期
Time datetime.time 时间
datetime datetime.datetime 时间日期

2 可选条件

选项 说明
primary_key 主键, 如果设为True,表示主键
unique 唯一索引 ,如果设为True,这列唯一
index 常规索引, 如果设为True,创建索引,提升查询效率
nullable 是否可以为null 默认True
default 默认值

(4)在flask中使用ORM模型

下面我们使用ORM模型

from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:20111673@127.0.0.1:3306/demo'
db = SQLAlchemy(app)  #

manager = Manager(app)

#创建User用户,表名为user
class User(db.Model):
    __table__name = 'user'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(20),index=True)
    sex = db.Column(db.Boolean,default=True)
    info = db.Column(db.String(50))

# 定义一个视图函数
@app.route('/create')
def create():
    # db.drop_all()  #删除仅为模型表
    db.create_all()  #创建模型表
    return '创建成功'

if __name__ == '__main__':
    manager.run()

(5)增加数据

添加数据方式1

#方式1
# sqlalchemy默认开启了事务处理
@app.route('/insert/')
def insert():
    try:
        u = User(username='WANGWU',info='personal WANGWU message')
        db.session.add(u)  #添加数据对象
        db.session.commit()  #事务提交
    except:
        db.session.rollback()#事务回滚
    return '添加单条数据!'

@app.route('/insertMany/')
def insertMany():
    u1 = User(username='name1',info='personal name1 message')
    u2 = User(username='name2',info='personal name2 message')
    db.session.add_all([u1,u2]) #以add_all(数据对象列表)
    db.session.commit() #
    return '添加多条数据!'

添加数据方式2

#方式2
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True  #在app设置里开启自动提交
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  #关闭数据追踪,避免内存资源浪费

@app.route('/insertMany/')
def insertMany():
    u1 = User(username='name1',info='personal name1 message')
    u2 = User(username='name2',info='personal name2 message')
    db.session.add_all([u1,u2])
    return '提交多条数据'

(6)更新与删除

# 类名.query  返回对应的查询集
# 类名.query.get(查询条件)  返回对应的查询对象
@app.route('/update/')
def update():
    u = User.query.get(1)
    u.username = 'update name'  #更新内容
    db.session.add(u)   #进行添加
    return 'update'

# 删除数据
@app.route('/delete/')
def delete():
    u = User.query.get(2)  #找到对应的查询集对象
    db.session.delete(u)  # 删除对应的u对象
    return 'delete id=2'

(7) 拆分MVT

目录结构

project/
    manage.py  #启动项存放
    ext.py  #作为当前sqlalchemy扩展
    settings.py  #配置存放
    app/
        __init__.py
        models.py  #应用models.py
        views.py   #应用视图views.py
    templates/     #模板目录
    static/  #静态文件目录

ext.py SQLAlchemy扩展

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()   #实例化db对象

蓝本view view.py视图函数

from flask import Blueprint
from .models import User
from ext import db
#创建蓝本view
view = Blueprint('view',__name__)
#定义视图函数
@view.route('/')
def index():
    return 'index'

@view.route('/insert/')
def insert():
    u = User(username='张三',info='个人信息')
    db.session.add(u)
    return 'insert success'

蓝本view models.py模型类

from ext import db  #导入db
#构建User模型类
class User(db.Model,Base):
    __table__name = 'user'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(20),index=True)
    sex = db.Column(db.Boolean,default=True)
    info = db.Column(db.String(50))

manage.py启动项

from flask import Flask
from flask_script import Manager
from ext import db
import settings
from app.view import view

app = Flask(__name__)
#将系统配置项Config类加载到app
app.config.from_object(settings.Config)
#通过db对象将app初始化
db.init_app(app)
#将蓝图view注册进app
app.register_blueprint(view)
manager = Manager(app)

if __name__ == '__main__':
    manager.run()

setting.py配置文件

class Config:
    #设置mysql+pymysql的连接
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:20111673@127.0.0.1:3306/demo'
    #加密设置
    SECRETE_KEY = 'secret_key'
    #关闭数据追踪
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    #开启提交
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True

前面我们采用系统的每次自动提交session 即SQLALCHEMY_COMMIT_ON_TEARDOWN

但是如果想自己定义提交方式,同时不想传入关键字参数,那么该怎样入手呢?这里提供一种思路

(8) 自定义增删改类

我们对模型类进行了修改,models.py 内容如下:

from ext import db
#定义了base基类
class Base:
    def save(self):
        try:
            db.session.add(self)  #self实例化对象代表就是u对象
            db.session.commit()  
        except:
            db.session.rollback()
    #定义静态类方法接收List参数        
    @staticmethod
    def save_all(List):
        try:
            db.session.add_all(List)
            db.session.commit()
        except:
            db.session.rollback()
    #定义删除方法
    def delete(self):
        try:
            db.session.delete(self)  
            db.session.commit()  
        except:
            db.session.rollback()
#定义模型user类
class User(db.Model,Base):
    __table__name = 'user'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(20),index=True)
    sex = db.Column(db.Boolean,default=True)
    info = db.Column(db.String(50))
    #
    def __init__(self,username='',info='',sex=True):
        self.username = username
        self.info = info
        self.sex = sex
#注意:
#原实例化:  u = User(username='张三',info='个人信息')
#现实例化: u = User('李四','李四个人信息')

在views.py中使用

from flask import Blueprint
from .models import User
from ext import db

view = Blueprint('view',__name__)

@view.route('/')
def index():
    return 'index'
#插入单条数据
@view.route('/insert/')
def insert():
    # u = User(username='test',info='default')
    u = User('xiaomeng','default')
    u.save()
    db.session.add(u)
    return 'insert success'
#保存多条数据
@view.route('/saveMany/')
def saveMany():
    u1 = User('zhan123','default123')
    u2 = User('li123','default message')
    User.save_all([u1,u2])
    return 'add many'
#删除数据
@view.route('/delete/')
def delete():
    u = User.query.get(1)  #获取查询集
    u.delete()
    return 'delete message'

其他都不做改变,基本思路是封装到类,通过多继承来实现方法的调用。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
63 0
|
3天前
|
JavaScript 前端开发 数据库
测试开发之路--Flask 之旅 (三):数据库
本文介绍了在 Flask 应用中实现权限管理的过程,包括使用 Flask-SQLAlchemy、Flask-MySQLdb、Flask-Security 和 Flask-Login 等扩展模块进行数据库配置与用户权限设置。首先创建数据库并定义用户、环境和角色模型,接着通过 Flask-Security 初始化用户和角色,并展示了如何便捷地管理权限。后续将深入探讨权限控制的具体应用。
19 4
测试开发之路--Flask 之旅 (三):数据库
|
28天前
|
SQL 存储 NoSQL
Redis6入门到实战------ 一、NoSQL数据库简介
这篇文章是关于NoSQL数据库的简介,讨论了技术发展、NoSQL数据库的概念、适用场景、不适用场景,以及常见的非关系型数据库。文章还提到了Web1.0到Web2.0时代的技术演进,以及解决CPU、内存和IO压力的方法,并对比了行式存储和列式存储数据库的特点。
Redis6入门到实战------ 一、NoSQL数据库简介
|
10天前
|
JSON 测试技术 数据库
Python的Flask框架
Python的Flask框架
|
10天前
|
存储 安全 数据库
Flask框架中,如何实现用户身份验证和会话管理
Flask框架中,如何实现用户身份验证和会话管理
|
30天前
|
SQL 数据库
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
|
15天前
|
数据库 Python
如何开始使用Flask框架
【9月更文挑战第1天】如何开始使用Flask框架
18 3
|
15天前
|
SQL Java OLAP
Hologres 入门:实时分析数据库的新选择
【9月更文第1天】在大数据和实时计算领域,数据仓库和分析型数据库的需求日益增长。随着业务对数据实时性要求的提高,传统的批处理架构已经难以满足现代应用的需求。阿里云推出的 Hologres 就是为了解决这个问题而生的一款实时分析数据库。本文将带你深入了解 Hologres 的基本概念、优势,并通过示例代码展示如何使用 Hologres 进行数据处理。
64 2
|
26天前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
28 1
|
30天前
|
SQL 存储 关系型数据库
数据库SQL入门指南
数据库SQL入门指南