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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
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'

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
1月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
292 7
|
6月前
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
655 77
|
6月前
|
人工智能 数据挖掘 API
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
765 21
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
|
6月前
|
Java 数据库 Docker
基于neo4j数据库和dify大模型框架的rag模型搭建
基于neo4j数据库和dify大模型框架的rag模型搭建
1740 35
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
773 3
SpringBoot入门 - 添加内存数据库H2
|
10月前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
268 4
SpringBoot入门(4) - 添加内存数据库H2
|
4月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
434 0
|
7月前
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
469 14
|
11月前
|
SQL 安全 Java
除了Flask框架,还有哪些框架能防止SQL注入攻击?
这些框架都在安全方面有着较好的表现,通过它们的内置机制和安全特性,可以有效地降低 SQL 注入攻击的风险。然而,无论使用哪个框架,开发者都需要具备良好的安全意识,正确配置和使用框架提供的安全功能,以确保应用的安全可靠。同时,持续关注安全更新和漏洞修复也是非常重要的。
530 162

热门文章

最新文章