Flask 的 ORM 模型-应用
在上一个小节中,讲解了 ORM 模型的基本概念,并给出一个最小的例子说明如何建立面向对象与关系数据库之间的映射关系。本小节介绍了 sqlAlchemy 的相关 API,通过一个完整的例子,对 MysqL 数据库进行增、删、改、查。
1. 功能概述
字段名 | 类型 | 描述 |
---|---|---|
sno | 整数 | 学号 |
name | 字符串 | 姓名 |
age | 整数 | 年龄 |
2. 配置 sqlAlchemy
首先,引入相关库,对访问 MysqL 进行配置,如下所示:
#!/usr/bin/python3
from flask import Flask
from flask_sqlalchemy import sqlAlchemy
import sys
app = Flask(__name__)
user = 'root'
password = '123456'
database = 'school'
uri = 'MysqL+pyMysqL://%s:%s@localhost:3306/%s' % (user, password, database)
app.config['sqlALCHEMY_DATABASE_URI'] = uri
db = sqlAlchemy(app)
3. 程序框架
程序包含有 4 个主要功能:
class Student(db.Model):
pass
def create_table():
pass
def insert_students():
pass
def query_students():
pass
def update_students():
pass
def delete_students():
pass
command = sys.argv[]
if command == 'create':
create_table()
elif command == 'insert':
insert_students()
elif command == 'query':
query_students()
elif command == 'update':
update_students()
elif command == 'delete':
delete_students()
首先,定义继承于 db.Model 的类 Student,该类映射数据库中的表 students;然后,分别定义了实现上述功能的函数,在后续小节会陆续填充;最后,例子程序是一个命令行程序,根据不同的命令行参数调用相应的功能函数。
4. 创建表
class Student(db.Model):
__tablename__ = 'students'
sno = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
age = db.Column(db.Integer)
def dump(self):
print(self.sno, self.name, self.age)
def create_table():
db.drop_all()
db.create_all()
首先,建立表和类的映射关系:创建类 Student 继承于 db.Model,表示类 Student 用于映射数据库中的表;设定 __tablename__ 为 students,表示将类 Student 映射到数据库中的表 students。
然后,建立属性和字段的映射关系:映射 sno 到表 students 的字段 sno,类型为整数 (db.Integer),primary_key=True 表示该字段是主键; 映射 name 到表 students 的字段 name,类型为整数 (db.String); 映射 age 到表 students 的字段 age,类型为整数 (db.Integer)。
调用 db.drop_all() 删除数据库 school 中的所有表格;调用 db.create_all() 创建已经建立映射关系的表 students,表 students 已经被映射到类 Student。
5. 插入数据
def insert_students():
tom = Student(sno = , name = 'tom', age = )
db.session.add(tom)
db.session.commit()
jerry = Student(sno = , name = 'jerry', age = )
mike = Student(sno = , name = 'mike', age = )
db.session.add_all([jerry, mike])
db.session.commit()
在第 2 行,通过类 Student 实例化生成一个实例 tom,调用 db.session.add(tom) 将该实例加入到数据库连接会话中,调用 db.session.commit() 提交保存到数据库。
在第 6 行和第 7 行,生成 2 个实例 jerry 和 mike,调用 db.session.add_all([jerry, mike]) 将两个实例批量加入到数据库连接会话中,调用 db.session.commit() 提交保存到数据库。
6. 查询数据
6.1 查询所有的学生
def query_students():
print('查询所有的学生')
students = Student.query.all()
for student in students:
student.dump()
print()
类 Student 映射为表 students,Student.query.all() 返回表 students 中所有的学生数据。
6.2 指定条件查询
print('查询所有年龄是 11 岁的学生')
students = Student.query.filter_by(age = )
for student in students:
student.dump()
print()
类 Student 继承于类 db.Model,继承了方法 db.Model.query.filter_by(conidtion),该方法的参数 condition 是查询条件,返回表中符合条件的数据。
类 Student 映射为表 students,Student.filter_by(age = 11) 指明查询条件为 age = 11, 返回表 students 中所有年龄是 11 岁的学生。
print('查询第一个年龄是 11 岁的学生')
students = Student.query.filter_by(age = )
student = students.first()
student.dump()
print()
6.4 根据条件组合查询
print('查询姓名是 jerry 并且年龄是 11 岁的学生')
students = Student.query.filter_by(age = , name = 'jerry')
for student in students:
student.dump()
print()
在方法 db.Model.query.filter_by(conidtion) 中,参数 condition 可以是多个。filter_by(age = 11, name = ‘jerry’) 表示查询姓名是 jerry 并且年龄是 11 岁的学生。
7. 更新数据
def update_students():
students = Student.query.filter_by(name = 'tom')
students.update({'name':'TOM'})
db.session.commit()
类 Student 映射为表 students,Student.filter_by(name = ‘tom’) 指明查询条件为 name = ‘tom’, 返回表 students 中所有姓名是 tom 的学生。
8. 删除数据
def delete_students():
students = Student.query.filter_by(name = 'mike')
students.delete()
db.session.commit()
类 Student 映射为表 students,Student.filter_by(name = ‘mike’) 指明查询条件为 name = ‘mike’, 返回表 students 中所有姓名是 mike 的学生。
9. 测试程序
2. 创建表 students
$ python3 app.py create
3. 向表 students 插入数据
$ python3 app.py insert
4. 查询表 students 中的数据
$ python3 app.py query
查询所有的学生
1 tom 12
2 jerry 11
3 mike 11
查询所有年龄是 11 岁的学生
2 jerry 11
3 mike 11
查询第一个年龄是 11 岁的学生
2 jerry 11
查询姓名是 jerry 并且年龄是 11 岁的学生
2 jerry 11
5. 更新表 students 中的数据
结果显示,姓名为 tom 的学生的姓名更改为 TOM。
6. 删除表 students 中的数据