python Flask-SQLAlchemy入门

郜俊晤
2023-12-01

Flask-SQLAlchemy简介

Flask是python的一个web框架,利用它可以快速搭建一个web服务器;SQLAlchemy则是一个用于操作数据库的ORM框架。
何为ORM框架?

ORM(Object Relational Mapping) 即对象关系映射,它将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做可以简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模型来操作数据库

Flask-SQLAlchemy是一个在Flask应用上增加SQLAlchemy支持的Flask扩展,它简化了在Flask中SQLAlchemy的使用,提供了更多工具来方便地完成简单任务。
Flask-SQLAlchemy官方文档详细,使用简单,使用它可以快速进行后端开发,因此我们在系统分析与设计课程项目中选择了它作为后端框架。
官方文档地址:https://flask-sqlalchemy.palletsprojects.com/en/2.x/
项目地址:https://github.com/haowe-7/Fat-Wallet-Backend
Flask-SQLAlchemy的语法跟SQlAlchemy有些不同,不要弄错了文档

简单使用

安装

 pip install flask
 pip install flask-sqlalchemy

配置数据库

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:admin@mysql/money'
db = SQLAlchemy(app)

app = Flask(__name__)初始化Flask应用,创建Flask框架。
SQLALCHEMY_DATABASE_URI用于连接数据库,这一行代码配置了数据库驱动:数据库类型:mysql,数据库名:money,账户:root,密码:admin。
db = SQLAlchemy(app)把创建的Flask框架与数据库绑定到一起。

创建表

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(40), nullable=False)

上述操作在python中就是定义一个User类,但它继承了db.Model类,在创建数据库的过程中会创建一个users的数据库表,有id、username、 email 3个字段,id为主键,username为unique且不能为空,email不能为空。

设置约束

定义mysql引擎和编码类型

__table_args__ = {
        'mysql_engine': 'InnoDB',
        'mysql_charset': 'utf8mb4',
}

定义外键约束

class Student(db.Model):
	__table_name__ = 'students'
	__table_args__ = (db.ForeignKeyConstraint(['user_id'], ['users.id'],
                      name='student_user_fc', ondelete="CASCADE"))
    user_id = db.Column(db.Integer)
    ...
                   

如上所示,建立了students表的user_id跟users表的id属性之间的外键约束,该约束名为student_user_fc,在对应的users中的数据删除时,会级联删除students中的数据。

定义两个字段组合的unique约束

class Collect(db.Model):
    __tablename__ = 'collects'
    __table_args__ = (db.UniqueConstraint('user_id', 'task_id', name='_collect_uc'))
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer)
    task_id = db.Column(db.Integer)

增删改查

插入数据

user1 = User(username='user1', email='user1@example.com')
user2 = User(username='user2', email='user2@example.com')
db.session.add(user1)
db.session.add(user2)
db.session.commit()

只有调用了db.session.commit()之后对数据库的改动才会提交到数据库中,数据库课程应该有讲到关于会话的知识。
查询数据

User.query.all()	# 查询所有数据
User.query.filter(username='user1').first()		#查询user1

删除数据

user1 = User.query.filter(username='user1').first()
db.session.delete(user1)
db.session.commit()

修改数据

user1 = User.query.filter(username='user1').first()
user1.email = 'user1@patch.com'
db.session.commit()

值得注意的是,查询数据的操作是不断重复的filter:

if user_id:
    q = q.filter(User.id == user_id)
if student_id:
    q = q.filter(User.student_id == student_id)
if username:
    q = q.filter(User.username == username)
return q.all()

如果user_idstudent_idusername都不为空,那么所进行的查询是同时判断了这3个字段的,而不是仅判断了username

 类似资料: