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

  ##sqlalchemy

#1、SQLAlchemy介绍
SQLAlchemy是Python编程语言下的一款ORM(对象关系映射)框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
#2、安装
pip3 install sqlalchemy 

#3、创建表结构
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

### 连接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 : 多条记录对象---反向查询
'''
class UserType(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-----正向查询
'''
class Users(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'),  ### 组合索引
    )


def drop_db():
    Base.metadata.drop_all(engine)
def create_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 in res:
     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 in res:
     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 in res: 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 * from Usertype res = session.query(UserType).filter(~UserType.id.in_([1,3,4])).all() for row in res: print(row.id, row.title) res = session.query(UserType.title).filter(~UserType.id.in_([1,3,4])).all() for row in res: print( row.title) #4、与,或 from sqlalchemy import and_, or_ res=session.query(UserType).filter(and_(UserType.id > 2,UserType.id <4)).all() for row in res: print(row.id,row.title) res=session.query(UserType).filter(or_(UserType.id > 2,UserType.title=='SVIP用户')).all() for row in res: print(row.id,row.title) ###5、 通配符 res=session.query(UserType).filter(UserType.title.like('%用户')).all() for row in res: print(row.id,row.title) ###6、limit res=session.query(UserType)[1:3] for row in res: print(row.id,row.title) ###7、排序 res=session.query(Users).order_by(Users.name.desc(),Users.type_id.asc()) for row in res: 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 import func 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 in res: print(row[0].id, row[0].name, row[1].title) ### 第二种方法:正向查询思想:隐藏属性,直接点可以使用 res = session.query(Users).all() for row in res: print(row.id, row.name, row.extra, row.usertype.title) ###11-2. 某一个类型下面的用户 ### 第一种方法:没使用反向查询思想 res = session.query(UserType).all() for row in res: 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 in res: print(row.id, row.title, row.xxoo) session.commit() session.close()

   ##架构与流程图

原文地址:https://www.cnblogs.com/liangzhenghong/p/11046393.html