day45
day45 SQLAlchemy
使用pymysql的前提条件
1.表要先建好
2.需要手动去写多条sql语句
改进:
类------------------>表
实例化-------------->数据
这种思想叫:ORM(object relationship mapping) 对象关系映射
基于这种思想,开发的产品,比较出名的ORM框架,叫SQLAlchemy
操作:
原理:将代码转换成sql语句执行
安装:pip3 install sqlalchemy
使用sqlalchemy连接mysql:
底层 使用pymysql来连接的
table_args:联合唯一索引
#####################代码开始
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
from sqlalchemy import and_, or_
#连接mysql
engine = create_engine("mysql+pymysql://root:123456@192.168.110.34:3306/db3?charset=utf8",max_overflow=5)
Base = declarative_base()
class UserType(Base):
__tablename__='usertype'
id=Column(Integer,autoincrement=True,primary_key=True)
name=Column(String(32),nullable=False,server_default='')
class User(Base):
__tablename__='user'
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))
usertype=relationship('UserType',backref='xxoo')
__table_args__ = (
# UniqueConstraint('id', 'name',name='uix_id_name'), ### 联合唯一索引
# Index('ix_name_extra', 'name', 'extra'), ### 组合索引
)
def drop_db():
Base.metadata.drop_all(engine)
def create_db():
Base.metadata.create_all(engine)
#####################################代码结束
#增加一条数据一条
# obj=UserType(name="普通")
# session.add(obj)
#增加多条
session.add_all([
UserType(name='1用户'),
UserType(name='2用户'),
UserType(name='3用户')
])
session.commit()
session close()
#查询
res = session.query(Users).all()
res = session.query(Users.name, Users.extra).all()
res = session.query(Users).filter_by(name='alex').all()
res = session.query(Users).filter_by(name='alex').first()
#查询所有,返回的是列表,列表中套对象
# res = session.query(UserType).all()
# for row in res:
# print(row.id,row.name)
###查询第一条
res = session.query(UserType).first()
print(res.id, res.name)
#####where条件
res=session.query(UserType).filter(UserType.name=='1用户',UserType.id==2).all()
for row in res:
print(row.id, row.name)
#如果只有一个值
print(res[0].name)
##或者用这个
res=session.query(UserType).filter_by(name='1用户').all()
######删除:要先找到,然后删除
#如果没有filter就把表删了
session.query(UserType).filter(UserType.id>3).delete()
#######修改id是3的给改了
session.query(UserType).filter(UserType.id==3).update({"name":"SVIP用户"})
# 例子
res = session.query(Users).filter_by(name='alex').all()
res = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
res = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
res = session.query(Users).filter(Users.id.in_([1,3,4])).all()
res = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
res = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
#from sqlalchemy import and_, or_
res = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
###如果session.query(Users),就代表是select * from括号里面可以写Users.id等
res = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
###and 和or 默认是and and_可以不写 上面这句就是user.id小于2或者name是eric
res = session.query(Users).filter(
or_(
Users.id < 2,
and_(Users.name == 'eric', Users.id > 3),
Users.extra != ""
)).all()
##################
#通配符,分组,分页,排序, between and or in
session.query(UserType).filter(UserType.id.between(1,3)).all()
#for循环去取,闭区间
##in操作,not in
#UserType.id.in_([1,3,4]) #in
#~UserType.id.in_([1,3,4]) #not in
#[1,3,4] 也可以子查询 去显示 session.query(UserType.id) 要用这个
##and or
#通配符
res = session.query(Users).filter(Users.name.like('e%')).all()
res = session.query(Users).filter(~Users.name.like('e%')).all()
#limit
res = session.query(Users)[1:2]
#排序
#order_by
res = session.query(Users).order_by(Users.name.desc()).all()
res = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
#分组
#group by
from sqlalchemy.sql import func
res = session.query(Users).group_by(Users.extra).all()
res = session.query(
func.max(Users.id),
func.min(Users.id)).group_by(Users.name).all()
res = session.query(
func.max(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
#连表
####################################################
连表:第一种方法
第二种方法
relationship(需要加反向查询)
usertype=relationship('UserType',backref='xxoo') ###可以认为是在usertype中加入xxoo列,然后查询xxoo
UserType,这个就是连表,可以在User表里查到UserType表里的记录
###################
res = session.query(User).all()
for row in res:
print(row.id, row.name, row.usertype.name)
##################
res = session.query(UserType).all()
for row in res:
print(row.id, row.title, row.xxoo)