Flask-SQLAIchemy基础(实验项目第一期)

本文介绍了如何在Flask应用中使用SQLAlchemy进行数据库操作,包括基础安装、配置数据库连接、创建ORM模型、表的CRUD操作以及常用的查询过滤和执行。

Flask-SQLAIchemy基本建立操作(实验项目第一期)

SQLAIchemy是什么

使用SQLAIchemy的一个优势在于不需要使用SQL语句来进行数据库的操作,它有一套自定义的更易于理解的规范,对没学过SQL语句的使用者比较友好
在这里插入图片描述

ORM

SQLAlchemy是一种在Python中使用的流行的SQL工具包,提供了ORM(对象关系映射),ORM可以将Python类和SQL表进行映射,它允许开发人员通过面向对象的方式使用关系数据库。

Flask框架的一个扩展

Flask-SQLAlchemy是Flask 框架的一个扩展,其对SQLAlchemy进行了封装,借助Flask-SQLAlchemy,可以使用Python类定义数据库模型,然后使用这些类来创建、读取、更新和删除相应的数据库表中的记录。此外,Flask-SQLAlchemy还提供了对数据库迁移的支持,使得随着应用程序的不断演进,修改数据库模式变得更加容易。

1.基础安装

版本依赖说明:
在这里插入图片描述

首先是最基础的安装Flask-SQLAlchemy(如果使用MySQL数据库的话还需要安装mysqldb)

pip install flask-sqlalchemy


pip install flask-mysqldb

2.数据库连接配置

Flask的数据库基本设置:

数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象(通常取名app)的’SQLALCHEMY_DATABASE_URI’中

# 创建Flask对象
app = Flask(__name__)

# 数据库配置:
# Flask数据库的设置: app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://账号:密码@数据库ip地址:端口号/数据库名"
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/mysqltest'
# 动态追踪修改设置,如未设置只会提示警告, 不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True

其他的设置:

在这里插入图片描述

(更多设置请查阅flask-sqlaichemy文档)

常用的SQLAIchemy字段类型

类型名python中类型说明
Integerint普通整数,一般是32位
SmallIntegerint取值范围小的整数,一般是16位
BigIntegerint或long不限制精度的整数
Floatfloat浮点数
Numericdecimal.Decimal普通整数,一般是32位
Stringstr变长字符串
Textstr变长字符串,对较长或不限长度的字符串做了优化
Unicodeunicode变长Unicode字符串
Booleanbool布尔值
Datedatetime.date时间
Timedatetime.datetime日期和时间
LargeBinarystr二进制文件

常用的SQLAlchemy列选项

选项名说明
primary_key如果为True,代表表的主键
unique如果为True,代表这列不允许出现重复的值
index如果为True,为这列创建索引,提高查询效率
nullable如果为True,允许有空值,如果为False,不允许有空值
default为这列定义默认值

常用的SQLAIchemy关系选项

选项名说明
backref在关系的另一模型中添加反向引用
primary join明确指定两个模型之间使用的联结条件
uselist如果为False,不使用列表,而使用标量值
order_by指定关系中记录的排序方式
secondary指定多对多中记录的排序方式
secondary join在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件

(更多设置请查阅flask-sqlaichemy文档)

3.创建实例对象

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 创建Flask对象
app = Flask(__name__)
#数据库配置(此处省略,2.数据库连接配置里有)
app.config['SQLALCHEMY_DATABASE_URI'] = ....
...
...
# 实例化SQLAlchemy对象db[这两行也可以写成db = SQLAlchemy(app)]
db = SQLAlchemy()
db.init_app(app)

注意:在单独运行调试时,对数据库操作需要在Flask的应用上下文中进行
否则会出现:RuntimeError: Working outside of application context.

# 防止出现RuntimeError: Working outside of application context.
app.app_context().push()

此处请注意:app对象为Flask的应用配置,db对象为SQLAIchemy对象SQLAIchemy对象需要知道它将要与哪个Flask应用程序实例绑定,如果在一个工程项目中不同的python文件中创建了不同的Flask实例,并且在每个文件中都创建了一个SQLAIchemy实例,则会导致问题:
RuntimeError: The current Flask app is not registered with this ‘SQLAlchemy’ instance. Did you forget to call ‘init_app’, or did you create multiple ‘SQLAlchemy’ instances?
(后期的项目文章里会具体讲到)

4.创建数据库表(定义ORM模型类)

创建User类继承自db.Model类,同时定义id,username,email,password…等属性,分别对应数据库中表user的列。

class User(db.Model):
    # 定义表名
    __tablename__ = 'users'
    # 定义列对象
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(32), unique=True, index=True)
    email = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))

    # repr()方法显示一个可读字符串
    def __repr__(self):
        return '<User: %d %s %s %s>' % (self.id, self.username, self.email, self.password)

# 创建表
db.create_all()
# 删除表:db.drop_all()

主程序中运行时还可能会出现Restarting with stat的问题

if __name__ == '__main__':
    app.debug = True  # 开启debug
    app.run(use_reloader=False)  
    # 在run()里加入参数 use_reloader=False,就可以解决 * Restarting with stat

常用参数说明(个人写的比较浅显,更多用法请查阅文档):

db.Model:所有模型类都应该继承自 db.Model。

__tablename__:指定模型类对应的数据库表名。如果不指定,则默认为类名的小写形式。

db.Column:用来定义模型类中的各个字段,需要指定字段类型。

primary_key=True:用来指定主键字段。

default:用来指定字段的默认值。

unique=True:用来指定字段的唯一性约束。

index=True:用来指定字段是否需要创建索引。

db.ForeignKey():用来定义外键关系。需要传入对应的表格的主键作为参数

db.relationship():用来定义模型之间的关系。第一个参数需要传入要关联的模型类名,第二个参数可以通过 backref 来指定反向引用

lazy:用来指定关系的加载方式,有两种常见的方式:
	 lazy=True:表示使用惰性加载,即在首次访问相关属性时才会加载数据。
     lazy=False:表示立即加载,即在查询时同时加载相关数据。

5.数据库的增删改查

Flask-SQLAlchemy中,插入、修改、删除操作(不使用SQL语句),均由数据库会话管理。
查询操作则是使用query对象操作数据。

1)插入、修改、删除操作

会话用db.session表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提交会话。

1)增删改:
1.	db.session.add(role)    添加到数据库的session中
2.	db.session.add_all([user1, user2]) 添加多个信息到session中
3.	db.session.commit()     提交数据库的修改(包括增//)
4.	db.session.rollback()   数据库的回滚操作
5.	db.session.delete(user) 删除数据库(需跟上commit)
例子:
# 1.添加数据
    user1 = User(id=1, name="小明")
    user2 = User(id=2, name="小白", password="123")
    try:
        db.session.add_all([user1, user2])  # 添加多个用add_all()
        # 提交添加,可通过rollback撤回
        db.session.commit()
    except Exception:
        print("add error")
    # 2.查询数据
    try:
        results = User.query.all()
        print(results)
    except Exception:
        print("query error")
    # 3.修改数据
    try:
        user1.username = "小红"
        db.session.commit()
    except Exception:
        print("update error")
    # 4.删除数据(需跟上commit)
    try:
        db.session.delete(user2)
        db.session.commit()
        db.session.rollback()  # 回滚
    except Exception:
        print("delete error")

2)查询操作

查询操作则是使用query对象操作数据。

2)查询:
1. all()返回查询到的所有对象
User.query.all()

2. 查询有多少个用户
User.query.count()

3. 查询第1个用户
User.query.first()

4. 查询id4的用户[3种方式]
# filter_by直接用属性名,比较用=, filter用类名.属性名,比较用==
# filter_by用于查询简单的列名,不支持比较运算符
# filter比filter_by的功能更强大,支持比较运算符,支持or_、in_等语法。
User.query.get(4)
User.query.filter_by(id=4).first()  #属性 =
User.query.filter(User.id==4).first() #对象名.属性 ==
User.query.filter_by(id=4).first()  #属性 =

例子:
# 获取用户提交的表单数据
    username = request.form.get('username')
    # 查询数据库,查看该用户名是否已经被注册
    existing_user = User.query.filter_by(username=username).first()
    if existing_user:
        # 如果用户名已经存在,返回一个错误信息
        response = {
            'status': 'error',
            'message': '该用户名已经被注册,请选择其他用户名'
        }
        return jsonify(response), 400
    # 如果用户名不存在,可以继续进行用户注册的逻辑
    email = request.form.get('email')
    password = request.form.get('password')

    
常用的SQLAIchemy查询过滤器:

在这里插入图片描述

常用的SQLAIchemy查询执行器:

在这里插入图片描述
此处不再过多叙述,更多请查阅文档

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值