# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
# 创建引擎
engine = create_engine('mysql+pymysql://{user}:{password}@{host}:{port}/{database}?charset={charset}')
session = sessionmaker(engine)()
# 基类模型
Base = declarative_base(engine)
# 创建模型
class Student(Base):
    """功能:学生映射模型类"""
    __tablename__ = 'Student'
    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID")
    name = Column(String(50), index=True, nullable=True, comment="学生名称")
    age = Column(Integer, comment="学生年龄")
    sex = Column(String(10), comment="学生性别")
新增数据到数据库,需要执行session.commit()提交事务
单个添加数据

# 创建一个学生对象
student = Student(name='Tony', age=18, sex='male')
# 添加到连接
session.add(student)
# 刷新连接,给对象添加自增ID
session.flush()
# 获取对象的ID
last_id = student.id
# 提交到数据库
session.commit()

批量添加数据

方式1:add_all(objects),刷新可获取自增ID列表 # 创建多个学生对象 students = [ Student(name='Jack', age=19, sex='male'), Student(name='Rose', age=20, sex='female'), # 添加到连接 session.add_all(students) # 刷新连接,给对象添加自增ID session.flush() insert_ids = [student.id for student in students] # 提交到数据库 session.commit() 方式2:bulk_save_objects(objects),无法获取自增ID列表 # 创建多个学生对象 students = [ Student(name='Jack', age=19, sex='male'), Student(name='Rose', age=20, sex='female'), # 添加到连接 session.bulk_save_objects(students) # 刷新连接,给对象添加自增ID session.flush() insert_ids = [student.id for student in students] # 提交到数据库 session.commit() 方式3:bulk_insert_mapping(class, list(dict1, dict2...)),无法获取自增ID列表 # 创建多个学生对象 mappings = [ dict(name='Jack10', age=19, sex='male'), dict(name='Jack20', age=19, sex='male'), # 添加到连接 session.bulk_insert_mappings(Student, mappings) # 刷新连接,给对象添加自增ID session.flush() insert_ids = [student.id for student in students] # 提交到数据库 session.commit() 1.查询全部字段全部数据

item_list = session.query(Student).all()
print(item_list)
for item in item_list:
    print(item.id, item.name, item.age, item.sex)
[<mymodel.Student object at 0x000002A0E6A38088>, <mymodel.Student object at 0x000002A0E6A38208>...]
Tony 18
Jack 16

2.查询指定字段全部数据

item_list1 = session.query(Student.name).all()
item_list2 = session.query(Student.name, Student.sex).all()
print(item_list1)
print(item_list2)
[('Tony',), ('Jack',)...]
[('Tony', 'male'), ('Jack', 'male')...]

3.获取返回结果的第一行

first_student_object = session.query(Student).first()
first_student_data = session.query(Student.name).first()

4.指定过滤条件筛选数据

# 单个过滤条件筛选
item_list = session.query(Student.name).filter(Student.age >= 18).all()
print(item_list)
# 多个过滤条件筛选(and)
item_list = session.query(Student.name, Student.age, Student.sex).filter(
    Student.age >= 10, Student.sex == 'female').all()
print(item_list)
# 多个过滤条件筛选(or)
item_list = session.query(Student.name, Student.age, Student.sex).filter(
      or_(Student.age >= 20, Student.sex == 'female')
).all()
print(item_list)

5.与或非查询(and, or, not)

# 默认逗号分隔条件即为与
item_list = session.query(Student.name, Student.age, Student.sex).filter(
      Student.age >= 20, Student.sex == 'female'
).all()
print(item_list)
# 使用and_()方法,即为或
item_list = session.query(Student.name, Student.age, Student.sex).filter(
      and_(Student.age >= 20, Student.sex == 'female')
).all()
print(item_list)
# 使用or_()方法,即为或
item_list = session.query(Student.name, Student.age, Student.sex).filter(
      or_(Student.age >= 20, Student.sex == 'female')
).all()
print(item_list)
# 使用not_()方法,即为或
item_list = session.query(Student.name, Student.age, Student.sex).filter(
      not_(Student.age >= 20, Student.sex == 'female')
).all()
print(item_list)
# 使用与或非组合筛选(and_(), or_(), not_())
item_list = session.query(Student).filter(
        Student.id < 2,
        and_(Student.name == 'Tony', Student.id > 3),
        Student.sex != ""
    )).all()
print(item_list)

6.查询数据并进行排序(asc, desc)

# 默认正序排列
item_list = session.query(Student.name, Student.age).order_by(Student.age).all()
# asc()函数正序排列
item_list = session.query(Student.name, Student.age).order_by(Student.age.asc()).all()
# desc()表示倒序
item_list = session.query(Student.name, Student.age).order_by(Student.age.desc()).all()

7.模糊查询(like, contains)

# 使用like(),即为like
item_list = session.query(Student.name, Student.age, Student.sex).filter(
    Student.name.like('%To%')
).all()
print(item_list) 
# 使用contains(),即为like
item_list = session.query(Student.name, Student.age, Student.sex).filter(
    Student.name.contains('To')
).all()
print(item_list) 

8.包含不包含查询(in, not in)

# 使用in_(),即为包含
item_list = session.query(Student.name, Student.age, Student.sex).filter(
    Student.age.in_([16, 20])
).all()
print(item_list) # [('Jane', 16, 'female'), ('Ben', 20, 'male')]
# 使用~和in_()组合,为不包含
item_list = session.query(Student.name, Student.age, Student.sex).filter(
    ~Student.age.in_([16, 20])
).all()
print(item_list)

9.区间查询(between...and...)

session.query(Student).filter(Student.id.between(1, 3), Student.name == 'Jack').all()

10.子查询

session.query(Student).filter(Student.id.in_(session.query(Student.id).filter(Student.name=='Rose'))).all()

11.分组查询(group by)

from sqlalchemy.sql import func
ret = session.query(
        Users.depart_id,
        func.count(Users.id),
).group_by(Users.depart_id).all()
for item in ret:
        print(item)
ret = session.query(
        Users.depart_id,
        func.count(Users.id),
).group_by(Users.depart_id).having(func.count(Users.id) >= 2).all()
for item in ret:
        print(item)

12.查询数据数量

count = session.query(Student).count()
print(count)

13.查询数据切片

item_list = session.query(Student.name).all()
print(item_list)

14.查询结果拼接

# 自动过滤重复数据
q1 = session.query(Student.name).filter(Student.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()
# 不自动过滤重复数据
q1 = session.query(Student.name).filter(Student.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()
删除数据使用delete()方法,同样也需要执行session.commit()提交事务

session.query(Student).filter(Student.name == 'Jack').delete()
session.commit()
item_list = session.query(Student.name, Student.age).all()
print(item_list)
修改数据可以使用update()方法,update完成后记得执行session.commit()

session.query(Student).filter(Student.name == 'Tony').update({'age': 22})
session.commit()
item = session.query(Student.name, Student.age).filter(Student.name == 'Tony').first()
print(item)