通过flask连接MySQL数据库后,使用ORM模型对数据库管理
ORM模型的优点:使用 ORM 做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰。支持多个关系数据库引擎,包括流行的 MySQL 、 PostgreSQL 和 SQLite 。可以非常轻松的切换数据库。
1.创建数据库
创建用户,其中包括
用户id(int,主键,自增)
用户姓名(varchar,非空)
密码(varchar,非空)等字段
继承db.Model模型成为ORM模型
class User(db.Model):
# 定义表名
__tablename__ = "user"
添加字段,使用db.Column映射成列属性,
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
with app.app_context():
db.create_all()
db.Column中常用的数据类型
类型名 | Python 类型 | 说明 |
---|---|---|
Integer | int | 普通整数,一般是32位 |
SmallInteger | int | 取值范围小的整数,一般是 16 位 |
BigInteger | int 或 long | 不限制精度的整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 定点数 |
String | str | 变长字符串 |
Text | str | 编程字符串,对较长或不限长度的字符串做了优化 |
Unicode | unicode | 变长 Unicode 字符串 |
UnicodeText | unicode | 变长 Unicode 字符串,对较长或不限长度的字符串做了优化 |
Boolean | bool | 布尔值 |
Date | datetime.date | 日期 |
Time | datetime.time | 时间 |
DateTime | datetime.datetime | 日期和时间 |
Interval | datetime.timedelta | 时间间隔 |
Enum | str | 一组字符串 |
PickleType | 任何 python 对象 | 自动使用 Pickle 序列化 |
LargeBinary | str | 二进制文件 |
2.增加数据
首先创建对象,然后将对象添加到session中,最后同步到数据库中
@app.route("/user/add")
def add_user():
# 1.创建ORM对象
user = User(username="张三", password="1111")
# 2.将ORM对象添加到db.session
db.session.add(user)
# 3.将db.session中的改变同步到数据库中
db.session.commit()
return "用户创建成功"
3.查询数据
@app.route("/user/query")
def query_user():
# 1.get查找:根据主键查找
# user = User.query.get(1)
# print(f"{user.id}: {user.username}-{user.password}")
# 2.filter查找
# 类列表的对象
users = User.query.filter(User.username.like("%张%"))
for user in users:
print(user.username)
return "数据查找成功"
四种查询方式
all | 返回一个QuerySet |
---|---|
fittler | 等同于sql中的where,返回的一个过滤后的QuerySet |
exclude | 回一个新的QuerySet,它包含不满足查询参数的对象 |
get | 只有一个对象满足你的查询,也就是查询必须且只有一个返回符合的查询语句 |
三种获取数据方式
- 第一种all
all相当于查询所有字段的返回,select * from 表
返回的Queryset类型,Queryset中包含的是表每一行返回的对象 - 第二种values
values相当于select 字段 from 表 返回的Queryset类型,Queryset中包含的是每一行数据字典的形式返回k代值字段,v代值数据 - 第三种-values_list
相当于select 字段 from 表 返回的Queryset类型,Queryset中包含的是每一行数据元组的形式返回字段数据
其他查询方式
返回QuerySet对象的
order_by() | 用来进行升序降序排列使用,默认升序,加-降序 |
---|---|
distinct() | 去重和values搭配使用 |
不返回对象的
count | *当我们只想查询 返回的条数的时候我们应该用count 比用first 要好,但当我们想要第一个返回的对象的时候我们可以用first |
---|---|
first/last |
queryset中支持链式操作book=Book.objects.all().order_by(’-nid’).first()
模糊查询常用的操作
__gt | 大于> |
---|---|
__gte | 大于等于>= |
__lt | 小于< |
__lte | 小于等于<= |
__exact | 精确等于 like ‘aaa’ |
__iexact | 精确等于 忽略大小写 ilike ‘aaa’ |
__contains | 包含 like ‘%aaa%’ |
__icontains | 包含,忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。 |
__in | 查询年龄在某一范围的学生Student.objects.filter(age__in=[10, 20, 30]) |
is null / is not null: | __isnull 判空 |
4.修改数据
@app.route("/user/update")
def update_user():
users = User.query.filter_by(username="张").first()
# 相当于在会话当中已经完成修改操作,不需要db.session
users.password = "9999"
db.session.commit()
return "数据修改成功"
5.删除数据
首先查找到对象,然后将从会话中删除,最后同步到数据库中
@app.route("/user/delete")
def delete_user():
# 1.查找
user = User.query.get(1)
# 2.删除
db.session.delete(user)
# 3.将db。session中的修改,同步到数据库中
db.session.commit()
return "删除成功"