一、创建表与保存数据
# 清除数据库里的所有数据
db.drop_all()
# 创建所有的表
db.create_all()
# 创建对象
role1 = Role(name="admin")
# session记录对象任务
db.session.add(role1)
# 提交任务到数据库中
db.session.commit()
role2 = Role(name="stuff")
db.session.add(role2)
db.session.commit()
us1 = User(name='wang', email='wang@163.com', password='123456', role_id=role1.id)
us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=role2.id)
us3 = User(name='chen', email='chen@126.com', password='987654', role_id=role2.id)
us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=role1.id)
# 一次保存多条数据
db.session.add_all([us1, us2, us3, us4])
db.session.commit()
二、查询数据
2.1常用的SQLAlchemy查询过滤器
2.2常用的SQLAlchemy查询执行器
2.3 查询代码
定义代码:here
-
all()返回查询到的所有对象
返回的是对象,如果在定义模块类对象时设置了 repr(self)方法可以让对象显示更明显。User.query.all()
没有设置 repr(self)方法
设置了 repr(self)方法 -
first()返回查询到的第一个对象
User.query.first()
-
get()方法
根据主键id获取对象,参数为主键,如果主键不存在没有返回内容User.query.get(1) #返回ID为1的数据
-
另一种查询方式
可以用db.session查询
-
filter_by精准查询
返回名字等于wang的所有人User.query.filter_by(name='wang').all()
返回第一个名字是wang,role_id是1的人
User.query.filter_by(name="wang", role_id=1).first()
-
filter模糊查询
返回名字结尾字符为g的所有数据
User.query.filter(User.name.endswith('g')).all()
返回名字等于wang的所有人
User.query.filter(User.name=="wang").all() #这里使用==filter_by使用=
- 逻辑非
返回名字不等于wang的所有数据
User.query.filter(User.name!='wang').all()
- 逻辑与
需要导入and,返回and()条件满足的所有数据。
from sqlalchemy import and_
User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()
- 逻辑或
需要导入or_
from sqlalchemy import or_
User.query.filter(or_(User.name!='wang',User.email.endswith('163.com'))).all()
- 取反
not_ 相当于取反
from sqlalchemy import not_
User.query.filter(not_(User.name=='chen')).all()
- offset与limit
offset()偏移原查询返回的结果,如果返回四个结果,使用offset(1)则从第二个开始显示,显示三个
limit()使用指定的值限定原查询返回的结果,如果返回2个结果,使用limit(2)则显示前两个结果
使用offset和limit实现分页效果
```python
li = User.query.offset(1).limit(2).all()
```
- order_by()排序
# 降序
User.query.order_by(User.id.desc()).all()
# 升序
User.query.order_by(User.id.asc()).all()
- group_by()分组
from sqlalchemy import func
db.session.query(User.role_id, func.count(User.role_id)).group_by(User.role_id)
- 查询数据后删除
user = User.query.first()
db.session.delete(user)
db.session.commit()
User.query.all()
- 更新数据
user = User.query.first()
user.name = 'dong'
db.session.commit()
User.query.first()
- 使用update
User.query.filter_by(name='zhang').update({'name':'li'})
- 关联查询
定义ForeignKey与relationship字段后可以查询
In [61]: ro = Role.query.get(1)
In [62]: type(ro)
Out[62]: db_demo.Role
In [63]: ro.users
Out[63]: [<db_demo.User at 0x1038c87d0>, <db_demo.User at 0x1038ef310>]
In [64]: ro.users[0].name
Out[64]: u'wang'
In [65]: ro.users[1].name
Out[65]: u'zhou'
In [66]:
In [67]: user
Out[67]: <db_demo.User at 0x1038c87d0>
In [68]: user.role_id
Out[68]: 1L
In [69]: Role.query.get(user.role_id)
Out[69]: <db_demo.Role at 0x10388d190>
In [70]: user.role # relationship字段中的backref定义的role
Out[70]: <db_demo.Role at 0x10388d190>
In [71]: user.role.name
Out[71]: u'admin'
In [72]: