Models:
在 models.py中:
创建模型:
from flask_sqlalchemy import SQLAlchemy
#创建操作数据库的对象
db = SQLAlchemy()
class Person(db.Model):
id = db.Column(
db.Integer,
primary_key=True,
autoincrement=True
)
name = db.Column(
db.String(30),
nullable=False,
unique=True,
)
age = db.Column(
db.Integer,
default=1
)
在views中:
创建表:
db.create_all()
@blue.route("/create")
def create_db():
db.create_all()
return "创建完毕"
删除表:
db.drop_all()
@blue.route("/drop")
def drop_db():
db.drop_all()
return "删除完毕"
添加数据:
单条数据:
@blue.route("/create_data")
def create_user():
# 创建数据
u = Person(
name="张三"
)
# 保存到数据库
db.session.add(u)
#提交
db.session.commit()
多条数据:
@blue.route("/create_data")
def create_user():
persons = []
for i in range(10):
u = Person(
name="张三" + str(i)
)
persons.append(u)
#添加全部
db.session.add_all(persons)
#提交
db.session.commit()
return "创建完毕"
查询数据:
@blue.route("/get_users")
def get_users():
res = Person.query.all()
for i in res:
print(i.name)
return "ok"
删除数据:
db.session.delete(模型对象)
db.session.commit() 删除成功
查询详细用法:
- 查询所有用户数据
User.query.all() - 查询有多少个用户
User.query.count() - 查询第1个用户
User.query.first() - 查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id=4).first()
User.query.filter(User.id==4).first()
filter:(类名.属性名==)
filter_by:(属性名=)
filter_by: 用于查询简单的列名,不支持比较运算符
filter比filter_by的功能更强大,支持比较运算符,支持or_、in_等语法。
-
查询名字结尾字符为g的所有数据[开始/包含]
User.query.filter(User.name.endswith(‘g’)).all()
User.query.filter(User.name.contains(‘g’)).all() -
查询名字不等于wang的所有数据[2种方式]
from sqlalchemy import not_
注意了啊:逻辑查询的格式:逻辑符_(类属性其他的一些判断)
User.query.filter(not_(User.name==‘wang’)).all()User.query.filter(User.name!=‘wang’).all()
-
查询名字和邮箱都以 li 开头的所有数据[2种方式]
from sqlalchemy import and_
User.query.filter(and_(User.name.startswith(‘li’), User.email.startswith(‘li’))).all()
User.query.filter(User.name.startswith(‘li’), User.email.startswith(‘li’)).all()
-
查询password是
123456
或者email
以itheima.com
结尾的所有数据
from sqlalchemy import or_
User.query.filter(or_(User.password==‘123456’, User.email.endswith(‘itheima.com’))).all() -
查询id为 [1, 3, 5, 7, 9] 的用户列表
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all() -
查询name为liu的角色数据
关系引用
User.query.filter_by(name=‘liu’).first().role.name -
跳过N条数 offset(N)
dogs = dogs.offset(3)
最多取N条
dogs = dogs.limit(4)
要先排序 才能再去使用limit 或者offset
dogs = dogs.order_by("-id").offset(2)
-
查询所有用户数据,并以邮箱排序
排序
User.query.order_by(‘email’).all() 默认升序
User.query.order_by(desc(‘email’)).all() 降序 -
查询第2页的数据, 每页只显示3条数据
help(User.query.paginate)
三个参数: 1. 当前要查询的页数 2. 每页的数量 3. 是否要返回错误
pages = User.query.paginate(2, 3, False)
pages.items # 获取查询的结果
pages.pages # 总页数
pages.page # 当前页数