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)
 
 
posted @ 2019-06-18 22:30  轩辕12  阅读(179)  评论(0编辑  收藏  举报