【SQLALchemy】创建表与数据操作

一、创建表与保存数据

 # 清除数据库里的所有数据
    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

  1. all()返回查询到的所有对象
    返回的是对象,如果在定义模块类对象时设置了 repr(self)方法可以让对象显示更明显。

    User.query.all()
    

    没有设置 repr(self)方法在这里插入图片描述
    设置了 repr(self)方法在这里插入图片描述

  2. first()返回查询到的第一个对象

    User.query.first()
    
  3. get()方法
    根据主键id获取对象,参数为主键,如果主键不存在没有返回内容

    User.query.get(1) #返回ID为1的数据
    
  4. 另一种查询方式
    可以用db.session查询
    在这里插入图片描述

  5. filter_by精准查询
    返回名字等于wang的所有人

    User.query.filter_by(name='wang').all()
    

    返回第一个名字是wang,role_id是1的人

    User.query.filter_by(name="wang", role_id=1).first()
    
  6. filter模糊查询
    返回名字结尾字符为g的所有数据

User.query.filter(User.name.endswith('g')).all()

在这里插入图片描述
返回名字等于wang的所有人

User.query.filter(User.name=="wang").all() #这里使用==filter_by使用=
  1. 逻辑非
    返回名字不等于wang的所有数据
User.query.filter(User.name!='wang').all()

在这里插入图片描述

  1. 逻辑与
    需要导入and,返回and()条件满足的所有数据。
from sqlalchemy import and_
User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()

在这里插入图片描述

  1. 逻辑或
    需要导入or_
from sqlalchemy import or_
User.query.filter(or_(User.name!='wang',User.email.endswith('163.com'))).all()

在这里插入图片描述

  1. 取反
    not_ 相当于取反
from sqlalchemy import not_
User.query.filter(not_(User.name=='chen')).all()

在这里插入图片描述

  1. offset与limit
    offset()偏移原查询返回的结果,如果返回四个结果,使用offset(1)则从第二个开始显示,显示三个
    limit()使用指定的值限定原查询返回的结果,如果返回2个结果,使用limit(2)则显示前两个结果
    使用offset和limit实现分页效果
```python
li = User.query.offset(1).limit(2).all()
```
  1. order_by()排序
	# 降序
	User.query.order_by(User.id.desc()).all()
	# 升序
	User.query.order_by(User.id.asc()).all()
  1. group_by()分组
from sqlalchemy import func
db.session.query(User.role_id, func.count(User.role_id)).group_by(User.role_id)
  1. 查询数据后删除
user = User.query.first()
db.session.delete(user)
db.session.commit()
User.query.all()
  1. 更新数据
user = User.query.first()
user.name = 'dong'
db.session.commit()
User.query.first()
  1. 使用update
User.query.filter_by(name='zhang').update({'name':'li'})
  1. 关联查询
    定义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]:

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页