一、定义表
继承base
class Notice(Base):
__tablename__ = 'projectdb'
# ID = models.BigIntegerField(primary_key=True)
继承db.Model
Column(String(255), primary_key=True)
"""
class User(UserMixin, db.Model):
"""定义用户模型"""
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(64), unique=True, index=True)
password = db.Column(db.Integer, nullable=False)
password = db.Column(db.DateTime, default=datetime.now())
password = db.Column(db.Text)
password = db.Column(db.Integer, db.ForeignKey('tablename.field', ondelete='CASCADE'))
password = db.Column(db.Boolean)
二、添加对象
1、ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
session.commit()
2、回滚
session.rollback()
3、批量插入(忽略插入)
# players_list:[{}, {}]
ignoreInsert=BaseGamePlayerData.__table__.insert().prefix_with('IGNORE').values(players_list)
session.execute(ignoreInsert)
session.commit()
session.close()
三、SQLAlchemy查询
1、简单查询
1、基本查询
User.query.all() # 查询所有用户数据
User.query.count() # 查询有多少个用户
User.query.first() # 查询第1个用户
User.query.get(1) # 根据id查询
查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id=4).all() # 简单查询 使用关键字实参的形式来设置字段名
User.query.filter(User.id == 4).all() # 复杂查询 使用恒等式等其他形式来设置条件
query.filter(User.name == 'ed') #equals
query.filter(User.name != 'ed') #not equals
query.filter(User.name.like('%ed%')) #LIKE
query.filter(User.name == None)#is None
query.filter(User.name != None)#not None
2、特殊查询 开头、包含、模糊查询
User.query.filter(User.name.endswith("g")).all()
User.query.filter(User.name.startswith("w")).all()
User.query.filter(User.name.contains("n")).all()
User.query.filter(User.name.like("%n%g")).all() 模糊查询
3、between
User.query.filter(User.age.between(12, 23).all()
2、逻辑查询:and 、in、or、not
1、in
uery.filter(User.name.in_(['ed','wendy', 'jack'])) #IN
query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%'))#IN
query.filter(~User.name.in_(['ed','wendy', 'jack']))#not IN
2、and_
query.filter(and_(User.name =='ed',User.fullname =='Ed Jones')) # and
query.filter(User.name == 'ed',User.fullname =='Ed Jones') # and
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')# and
3、or_
query.filter(or_(User.name =='ed', User.name =='wendy')) #or
query.filter(User.name.match('wendy')) #match
4、not_
User.query.filter(not_(User.name == "wang")).all()
User.query.filter(User.name != "wang").all()
3、排序,分组,limit,分页,having,paginate
1、order_by 、limit
User.query.order_by(User.age, User.id.desc()).limit(5).all() # ID排序取5条
2、group_by、having
session.query(User.age,func.count(User.id)).group_by(User.age).all() # 按年纪分组
session.query(User.age,func.count(User.id))\
.group_by(User.age).having(User.age < 18).all() 分组之后再筛选
3、paginate
pn = User.query.paginate(2, 3) # 分页查询, 每页3个, 查询第2页的数据
pn.items 获取该页的数据 pn.page 获取当前的页码 pn.pages 获取总页数
4、返回的数量
query.filter(User.name == 'ed').all()
query.filter(User.name == 'ed').first()
query.filter(User.name == 'ed').one()
query.filter(User.name == 'ed').first().scalar()
5、嵌套查询
1、取指定ID数据 select * from table where field in (select field from table)
data = db.session.query(Koldouyu).filter(
Koldouyu.room_id.in_(db.session.query(Kollist.roomId).filter())).group_by(Koldouyu.room_id).all()
6、聚合函数
1、sum、max、min
session.query(
func.sum(models.Users.age), # 所有数相加的值
func.max(models.Users.age), #最大值
func.min(models.Users.age) #最小值
func.avg(models.Users.age) # 均值
).first()
session.query(
func.avg(models.Users.age) # 均值
).scalar() # 直接获取数据
四、更新、setattr(自定字段更新)
一、多条跟新
db.session.query(Member).filter(Member.team_id == team_id).update({Member.signed: 1})
db.session.commit()
二、查询
team_leader = db.session.query(Team).filter(Team.id == team_id, Team.team_leader_tag == team_leader_tag).first()
team_leader.signed = 1
db.session.commit()
三、自定字段更新
场景(如 提前不知更新字段,flask接口参数传过来哪个字段就更新哪个字段)
player = session.query()..
setattr(player, field, value)
session.commit()
四、in、notin
update_stmt = EquipmentStatusReal.__table__.update().where(EquipmentStatusReal.equipment_id.in_(equipments)).values(status=1)
update_stmt1 = EquipmentStatusReal.__table__.update().where(EquipmentStatusReal.equipment_id.notin_(equipments)).values(status=0)
session.execute(update_stmt)
session.execute(update_stmt1)
五、插入数据
1、定义模型
class TestTable(Base):
__tablename__ = 'test'
id = Column(Integer, primary_key=True, autoincrement=True)
age = Column(Integer)
name = Column(String(255))
roly = Column(String(255))
2、批量插入数据
# 简历连接
Session = sessionmaker(bind=engine, autocommit=False)
session = Session()
# 批量数据
test_data = [{"age": 10, "name": "xiahon", "roly": "sd"}, {"age": 20, "name": "heihei", "roly": "打野"}]
1、普通的批量插入
session.execute(
TestTable.__table__.insert(),
test_data
)
2、# IGNORE 批量忽略插入
ignoreInsert = TestTable.__table__.insert().prefix_with('IGNORE').values(test_data)
session.execute(ignoreInsert)
3、单条模型插入
one_data = TestTable(
age=1,
name="sd",
roly="real_name"
)
session.add(one_data)
# 提交并关闭连接
session.commit()
session.close()