sqlachelmy的使用

一、增删改查的使用

数据库表的初始化

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer,String,Text,Date,DateTime
from sqlalchemy import create_engine


Base = declarative_base()

class Users(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=False)
    depart_id = Column(Integer)

def create_all():
    engine = create_engine(
        "mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )

    Base.metadata.create_all(engine)

def drop_all():
    engine = create_engine(
        "mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )
    Base.metadata.drop_all(engine)

if __name__ == '__main__':
    drop_all()
    create_all()

 

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/mytest?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) SessionFactory = sessionmaker(bind=engine) # 根据Users类对users表进行增删改查 session = SessionFactory() # 创建表结构,只有继承了Base的类才会被初始化 Base.metadata.create_all(engine)

增删改查

1. 增加
obj = Users(name='alex')
session.add(obj)
session.commit()

session.add_all([
        Users(name='小东北'),
        Users(name='龙泰')
])
session.commit()
session.close()
增加
session.query(Users).filter(Users.id >= 2).delete()
session.commit()
删除
session.query(Users).filter(Users.id == 4).update({Users.name:'二郎神'})
session.query(Users).filter(Users.id == 4).update({'name':'孙悟空'})
session.query(Users).filter(Users.id == 4).update({'name':Users.name+"DSB"},synchronize_session=False)
session.commit()

# synchronize_session代表以字符串的形式更新,如果不添加此参数,默认以数字的形式进行更新。
更改
result = session.query(Users).all()
for row in result:
        print(row.id,row.name)

result = session.query(Users).filter(Users.id >= 2)
for row in result:
        print(row.id,row.name)

result = session.query(Users).filter(Users.id >= 2).first()
print(result)
查看

指定查询字段(列)

# 原生sql
select id,name as cname from users;

# sqlachelmy语句
result = session.query(Users.id,Users.name.label('cname')).all()
for item in result:
        print(item[0],item.id,item.cname)

and查询(默认)

session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()

between查询

session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()

in查询

session.query(Users).filter(Users.id.in_([1,3,4])).all()
session.query(Users).filter(~Users.id.in_([1,3,4])).all()

# in查询要使用in_
# ~代表反向查询

子查询

session.query(Users).filter(Users.id.in_(session.query(Users.id).filter(Users.name=='eric'))).all()

and 和 or查询

from sqlalchemy import and_, or_
session.query(Users).filter(Users.id > 3, Users.name == 'eric').all()
# and_为默认的使用方法
session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'eric', Users.id > 3),
        Users.extra != ""
    )).all()

filter_by

session.query(Users).filter_by(name='alex').all()

# filter_by与filter功能相同,只是filter传入的是一个值

通配符查询

ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()

# 相当于原生sql中的 like 'e%'

切片

result = session.query(Users)[1:2]

排序

ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()

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)

from sqlalchemy.sql import func

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)

# func中含有sql计算方法
# 一旦使用了func方法,再想过滤查询只能使用having方法

union 和 union_all

"""
select id,name from users
UNION
select id,name from users;
"""
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()

q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()

# 二者的区别在于union会合并重复的查询结果,而union_all不会,它让然会将重复的结果累加到结果下面。

# union查询类似于left join或者right join查询

 

转载于:https://www.cnblogs.com/ttyypjt/p/11084132.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值