- 什么是ORM
使用关系对象映射进行数据库操作。 将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 分类 -DB first 手动创建数据库和表,自动生成类 -code first 手动创建类和数据库,自动生成表 (SQLAlchemy属于code first) 类 -> 表 对象 -> 行
- 安装SQLAlchemy
pip install SQLAlchemy
- 创建表
#首先导入需要的模块(包含了下面要用的) from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index from sqlalchemy.orm import sessionmaker,relationships from sqlalchemy import create_engine #首先构造一个基类 Base = declarative_base() #根据表对应类的关系,创建类 class User(Base): __tablename__ = 'user' id = Column(Integer,primary_key=True,autoincrement=True) name = Column(String(30),nullable=True) email = Column(String(30),nullable=True) user_type_id = Column(Integer,ForeignKey('usertype.id')) class UserType(Base): __tablename__ = 'usertype' id = Column(Integer, primary_key=True, autoincrement=True) title = Column(String(20),nullable=False) #声明engine以连接操作数据库 #参数的格式:数据库类型 模块类型 用户名 密码 IP 端口 数据库 编码 engine = create_engine("mysql+pymysql://root:[email protected]:3306/testorm?charset=utf8",max_overflow=5) #创建表 Base.metadata.create_all(engine) #删除表 Base.metadata.drop_all(engine)
- 增
#要操作数据库首先要获得一个session
#下面的操作最后都要:session.commit()。最后session.close()
Session = sessionmaker(bind=engine) session = Session() #根据对象对应行,我们创建一个对象 obj = UserType(title='普通用户') session.add(obj) #插入一个 #添加多行 objs = [ UserType(title='黑铁用户'), UserType(title='白金用户'), UserType(title='黄金用户'), ] session.add_all(objs) - 删
#以删除id>2的UserType数据为例 session.query(UserType).filter(UserType.id>2).delete()
- 改
#将id>0的行的title改为哈哈 session.query(UserType.id,UserType.title).filter(UserType.id>0).update({'title':'哈哈'}) #在id>0的title后面添加一个x session.query(UserType.id,UserType.title).filter(UserType.id>0).update({UserType.title:UserType.title+"x"},synchronize_session=False)
- 查
#当我们执行seesion.query(...)之后,得到的是一个sql语句 #通过all()方法可以得到对象(行) #相当于:select * from usertype; user_type_list = session.query(UserType).all() #取出来的是对象 for row in user_type_list: print(row.id,row.title) #相当于:select * from usertype where id>2; user_type_list = session.query(UserType).filter(UserType.id>2)
- 条件
#相当于where后面的条件 ret = session.query(Users).filter_by(name='hsr').all() #如果filter里面参数直接用逗号隔开,相当于and ret = session.query(Users).filter(Users.id > 1, Users.name == 'hsr').all() #范围between ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'hsr').all() #包括in ret = session.query(Users).filter(Users.id.in_([1,3,4])).all() #not in ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all() #in 子查询 ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='hsr'))).all() from sqlalchemy import and_, or_ #and ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'hsr')).all() #or ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'hsr')).all() #条件1 or 条件2 and条件3 or 条件4 ret = session.query(Users).filter( or_( Users.id < 2, and_(Users.name == 'hsr', Users.id > 3), Users.extra != "" )).all()
- 通配符
#跟sql语句的like一样,%匹配多个,_匹配1个 ret = session.query(Users).filter(Users.name.like('e%')).all() ret = session.query(Users).filter(~Users.name.like('e%')).all()
- 限制
#limit ret = session.query(Users)[1:2]
- 排序
#按名字降序 ret = session.query(Users).order_by(Users.name.desc()).all() #按id升序 ret = session.query(Users).order_by(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()
- 连表
#按Users.id == Favor.nid连表 ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all() #笛卡尔积 ret = session.query(Person).join(Favor).all() #左连接 ret = session.query(Person).join(Favor, isouter=True).all()
- 组合
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()
- 子查询
#例1:select * from (select * from tb) as B q1 = session.query(UserType).filter(UserType.id > 0).subquery() result = session.query(q1).all() print(result) #例2(重点是as_scalar()) select id , (select * from users where users.user_type_id=usertype.id) from usertype; session.query(UserType,session.query(Users).filter(Users.id == 1).subquery()) session.query(UserType,Users) result = session.query(UserType.id,session.query(Users).as_scalar()) print(result) result = session.query(UserType.id,session.query(Users).filter(Users.user_type_id==UserType.id).as_scalar()) print(result)
- 关系
#获取用户信息以及与其关联的用户类型名称 class User(Base): __tablename__ = 'user' id = Column(Integer,primary_key=True,autoincrement=True) name = Column(String(30),nullable=True) email = Column(String(30),nullable=True) user_type_id = Column(Integer,ForeignKey('usertype.id')) user_type = relationship('UserType',backref='xx') #新增 user_list = session.query(Users) for row in user_list: print(row.name,row.id,row.user_type.title)
ORM框架 SQLAlchemy
猜你喜欢
转载自www.cnblogs.com/walthwang/p/10454319.html
今日推荐
周排行