#1、SQLAlchemy介绍
SQLAlchemy是Python编程语言下的一款ORM(对象关系映射)框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。#2、安装
pip3 install sqlalchemy#3、创建表结构
from sqlalchemy.ext.declarative importdeclarative_basefrom sqlalchemy importColumn, Integer, String, ForeignKey, UniqueConstraint, Indexfrom sqlalchemy.orm importsessionmaker, relationshipfrom sqlalchemy importcreate_engine### 连接MySQL
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/db3?charset=utf8", max_overflow=5)
Base=declarative_base()'''create table users(
id int auto_increment primary key,
name varchar(32) not null default '',
extra varchar(32) not null default ''
)'''
'''Usertype
id title xxoo
1 普通用户
row.xxoo : 多条记录对象---反向查询'''
classUserType(Base):__tablename__ = 'usertype' ### 表名
id = Column(Integer, autoincrement=True, primary_key=True)
title= Column(String(32), nullable=False, server_default='')'''users
id name extra type_id
1 zekai nb 1
usertype = releationship('Usertype')
row.usertype-----正向查询'''
classUsers(Base):__tablename__ = 'users'id= Column(Integer, autoincrement=True, primary_key=True)
name= Column(String(32), nullable=False, server_default='')
extra= Column(String(32), nullable=False, server_default='')#建立外键,通过类名点属性,不需要单引号
type_id=Column(Integer,ForeignKey(UserType.id))#建立外键,通过对象名点属性,需要单引号
#type_id = Column(Integer, ForeignKey('usertype.id'))
usertype = relationship('UserType', backref='xxoo')__table_args__ =(#UniqueConstraint('id', 'name', name='uix_id_name'), ### 联合唯一索引
#Index('ix_name_extra', 'name', 'extra'), ### 组合索引
)defdrop_db():
Base.metadata.drop_all(engine)defcreate_db():## 会将当前执行文件中所有继承自Base类的类,生成表
Base.metadata.create_all(engine)#drop_db() #要重新生成表或者要修改表 要先drop掉
create_db()###4、操作表中的数据
Session= sessionmaker(bind=engine)
session=Session()### 增加一条数据,obj为UserType类的一个对象,即对应的时一行数据
obj = UserType(title='普通用户')
session.add(obj)
session.commit()### 添加多条数据---要提交
session.add_all([
UserType(title='VIP用户'),
UserType(title='VIP中P用户'),
UserType(title='SVIP用户'),
UserType(title='黑金用户')
])
session.commit()### 查询#### 查询全部 返回的是一个列表, 列表中套对象,末尾不加all()打印的时sql语句,sqlalchemy自动帮我们转化为sql
res =session.query(UserType).all()for row inres:print(row.id, row.name)#### 查询一条数据
res =session.query(UserType).first()print(res)### where条件 #filter内传的是表达式,逗号分隔,默认为and,
res = session.query(UserType).filter(UserType.title=='VIP用户', UserType.id==2).all()#得到一个对象在列表中,可以for循环遍历
for row inres:print(row.id, row.name)#或者直接索引点属性
print(res[0].name, res[0].id)
res= session.query(UserType).filter_by(name='VIP用户').all()print(res)### 删除:---要提交
session.query(UserType).filter(UserType.id>3).delete()
session.query(UserType).filter(UserType.id.in_([3,4])).delete(synchronize_session=False)
session.commit()## 修改---要提交
#修改一条
session.query(UserType).filter(UserType.id == 3).update({"title" : "SVIP用户"})
#修改多条
session.query(UserType).filter(UserType.id.in_([3,4])).update({"title" : "SVIP用户"},synchronize_session=False)
session.commit()### MySQL 高级查询操作
#### 通配符 分组 分页 排序 between and in not in
### 1、between ... and ...
res = session.query(UserType).filter(UserType.id.between(1,3)).all()for row inres:print(row.id, row.title)###2、 in 操作 bool_
res = session.query(UserType).filter(UserType.id.in_([1,3,4])).all()print(res)### 3、非 not in #~代表取反,转换成sql就是关键字not
select * fromUsertype
res= session.query(UserType).filter(~UserType.id.in_([1,3,4])).all()for row inres:print(row.id, row.title)
res= session.query(UserType.title).filter(~UserType.id.in_([1,3,4])).all()for row inres:print( row.title)#4、与,或
from sqlalchemy importand_, or_
res=session.query(UserType).filter(and_(UserType.id > 2,UserType.id <4)).all()for row inres:print(row.id,row.title)
res=session.query(UserType).filter(or_(UserType.id > 2,UserType.title=='SVIP用户')).all()for row inres:print(row.id,row.title)###5、 通配符
res=session.query(UserType).filter(UserType.title.like('%用户')).all()for row inres:print(row.id,row.title)###6、limit
res=session.query(UserType)[1:3]for row inres:print(row.id,row.title)###7、排序
res=session.query(Users).order_by(Users.name.desc(),Users.type_id.asc())for row inres:print(row.id,row.title)###8、分组 过滤
先手动在命令行添加数据
insert into users(name,extra,type_id) values('zekai','nb',5),('egon','sb',3),('lxx','bb',1),('owen','xx',3),('jerry','xn',1);from sqlalchemy importfunc
res=session.query(
Users.type_id,
func.max(Users.id),
func.min(Users.id)
).group_by(Users.type_id).all()print(res)
ret=session.query(
func.max(Users.id),
func.min(Users.id)).group_by(Users.type_id).having(func.min(Users.id)>2).all()###9、子查询
session.query(UserType).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()### 10、连接 :默认为内连接,指定参数isouter=True为left join
res=session.query(Users,UserType).join(UserType)print(res) 打印默认为内连接sql语句
res= session.query(Users,UserType).join(UserType,isouter=True)#print(res) 指定参数为左连接###11、正向、反向查询思想-----usertype = relationship('UserType', backref='xxoo')放在关联表里面(*****************************重点******)###11-1. 查询某一个用户的用户类型### 第一种方法:没使用正向查询方法
res = session.query(Users,UserType).join(UserType, isouter=True).all()#print(res)
for row inres:print(row[0].id, row[0].name, row[1].title)### 第二种方法:正向查询思想:隐藏属性,直接点可以使用
res =session.query(Users).all()for row inres:print(row.id, row.name, row.extra, row.usertype.title)###11-2. 某一个类型下面的用户### 第一种方法:没使用反向查询思想
res =session.query(UserType).all()for row inres:print(row.id, row.title, session.query(Users).filter(Users.type_id ==row.id).all() )### 第二种方法:使用反向查询思想(这里说明一下Users表中type_id字段关联UserType表中id字段,现在直接在UserType找属性,就可以理解为反向查找)
res =session.query(UserType).all()for row inres:print(row.id, row.title, row.xxoo)
session.commit()
session.close()