sqlalchemy mysql创建表_Python Day 43 Mysql基础语法(五)sqlalchemy、创建表、增删改查、高级查询操作、正向反向查询...

本文介绍了Python的ORM框架SQLAlchemy,详细展示了如何连接MySQL数据库、创建表结构,包括`UserType`和`Users`表,并演示了增删改查、正向反向查询等高级查询操作。
摘要由CSDN通过智能技术生成

#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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值