通过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 "删除成功"