ORM框架

1.ORM框架:SQLALchemy

sqkalchemy是python编程语言下的一款ORM框架,该框架建立在数据库API上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

安装:pip3 install SQLAlchemy

SQLalchemy本身无法操作数据库,其必须依赖pymsql等第三方插件。Dialect用于和数据API进行交流,

根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

pymysql: 
     mysql+pymsql://<username>:<password>@<host>/<dbname>[?<options>]
     mysql+pymysql://root:@localhost:3306/db3?charset=utf8", max_overflow=5

作用:提供简单的规则、自动转换成SQL语句

       -DB first:手动创建数据库以及表  ->ORM框架 –>自动生成类

       -code first:手动创建类和数据库  ->ORM框架 –>以及表

2.ORM功能使用

-创建数据库表

              -连接数据库

              -类转换SQL语句

 -操作数据行

1、创建表: 类--->是表    对象---->是数据行

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index,CHAR,VARCHAR
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import create_engine
Base=declarative_base()
        #创建表单
class UserType(Base): #继承Base类
    __tablename__="usertype"
    id=Column(Integer,primary_key=True,autoincrement=True)
    title=Column(VARCHAR(32),nullable=True,index=True)
user_type=relationship("UserType",backref="xx")     #正向   #relationship 谁有外键加谁旁边


class Users(Base): #继承Base类
    __tablename__="users"
    id=Column(Integer,primary_key=True,autoincrement=True)
    name=Column(VARCHAR(32),nullable=True,index=True)
    email=Column(VARCHAR(16),unique=True)
    user_type_id=Column(Integer,ForeignKey("usertype.id"))

 #建立索引值及联合唯一索引值 规则让这么写
# __table_args__ = (
#  UniqueConstraint('id', 'name', name='uix_id_name'),
#  Index('ix_n_ex','name', 'email',),
# )

engine=create_engine("mysql+pymysql://root:@localhost:3306/db3?charset=utf8",max_overflow=5)
#找到所有继承Base的类,类—SQL语句在数据库创建表
# Base.metadata.create_all(engine)
#找到所有继承Base的类,类—SQL语句在数据库删除表
# Base.metadata.drop_db(engine)

#操作数据行:去引擎获取一个连接
Session=sessionmaker(bind=engine)
session=Session()
View Code

  

2、操作表

增:
# obj1=UserType(title="普通用户")
# session.add(obj1)
#********多行增加*******
objs=[
    UserType(title="超级用户"),
    UserType(title="白金用户"),
    UserType(title="黑金用户")
]
session.add_all(objs)
session.commit()
View Code
查:
# *******查*********
# print(session.query(UserType))
# user_type_list=session.query(UserType).all()   #查看并取到用户信息
# for row in user_type_list:
#     print(row.id,row.title)
 
#按照条件查询
# user_type_list=session.query(UserType.id,UserType.title).filter(UserType.id>1)
# for row in user_type_list:
#     print(row.id,row.title)
View Code

  删:

# *******删*******
session.query(UserType.id,UserType.title).filter(UserType.id>2).delete()
session.commit()
View Code

  改:

# *******修改*******
# session.query(UserType.id,UserType.title).filter(UserType.id>0).update({"title":"黑金"})  #第第一种修改
# session.query(UserType.id,UserType.title).filter(UserType.id>0).update({UserType.title:UserType.title+"x"},
#                synchronize_session=False) #与前面的数据是一致,类型不一样,操作不一样

#session.query(UserType.id,UserType.title).filter(UserType.id>0).update({"num:Users.num+1},synchronize_session="evaluate")
session.commit()
View Code
其他:
#条件
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'eric', Users.id > 3),
        Users.extra != ""
    )).all()


# 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()   ~ 取非

# 分页
ret = session.query(Users)[1:2]

# 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
    
    #分组
       from sqlalchemy.sql import func

ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id)).group_by(Users.name).all()

ret = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()

#连表
# ret=session.query(Users).join(UserType)   #第一种连表  inner join
# print(ret
# ret=session.query(Users).join(UserType,isouter=True)  # 第二种 left join
# print(ret)

      # 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()

q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()
View Code
#问题1:获取用户信息以及其关联的用户类型名称    FK,Relationship=>正向操作)
# user_list=session.query(Users)
# for row in user_list:
# print(row.name,row.id,row.user_type.title)
获取用户信息
#  问题2:获取用户类型                backref=’xx’
# type_list=session.query(UserType)
# for row in type_list:
#print(row.id,row.title,row.xx)
获取用户类型

原文地址:https://www.cnblogs.com/niejinmei/p/7008797.html