Python3使用SQLAlchemy(ORM)对象关系映射器操作MySQL

本地测试了下sqlalchemy,使用起来比较简单,直接来看我的代码吧,花了半天实践整理的,数据就是用的我的博客的

#!/usr/bin/python3
#coding:utf-8
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,and_,or_,create_engine
from sqlalchemy.orm import sessionmaker

#初始化基类
Base = declarative_base()
#定义表对象并集成基类
class Category(Base):
    __tablename__ = 'zbp_category'
    cate_ID = Column(Integer, primary_key=True)
    cate_Name = Column(String(50))
    cate_Order = Column(Integer)
    cate_Count = Column(Integer)
    cate_Alias = Column(String(255))
    cate_Intro = Column(String)
    cate_RootID = Column(Integer)
    cate_ParentID = Column(Integer)
    cate_Template = Column(String(50))
    cate_LogTemplate = Column(String(50))
    cate_Meta = Column(String)

#初始化数据库连接:
engine = create_engine("mysql+pymysql://root:root@localhost:3306/sulao")
#创建DBSession类型:
DBSession = sessionmaker(bind=engine)
#创建session对象:
session = DBSession()

#查找所有
ret = session.query(Category).all()
for i in ret:
    print(i.cate_Name)
    
#查找指定条件返回列表,使用filter_by时条件只能是=,有其他逻辑的条件请使用filter
ret1 = session.query(Category).filter_by(cate_ID=5).all()
for i in ret1:
    print(i.cate_Name)
    
#指定查找返回对象,使用filter_by时条件只能是=,有其他逻辑的条件请使用filter
ret2 = session.query(Category).filter_by(cate_ID=5).first()
print(ret2.cate_Name)

#多个条件查找,使用filter过滤参数==
ret3 = session.query(Category).filter(Category.cate_ID>0, Category.cate_RootID==0).all()

#通配符%,取反请使用条件~作为参数前缀,例:~Category.cate_Name.like('%sql%')
ret4 = session.query(Category).filter(Category.cate_Name.like('%sql%')).all()
    
#排序
ret5 = session.query(Category).filter(Category.cate_ID>5).order_by(Category.cate_ID.asc()).all()
    
#or和and,需要导入模块
ret6 = session.query(Category).filter(or_(Category.cate_ID>5, Category.cate_Name.like('%sql%'))).all()
    
#查询指定行数据,用切片的方式
ret7 = session.query(Category)[:6]
    
#双表联查
ret8 = session.query(Category, Post).filter(Category.cate_ID==Post.log_CateID).all()

#组合
t1 = session.query(Category).filter(Category.cate_ID>5)
t2 = session.query(Post).filter(Post.log_CateID>100)
ret9 = t1.union(t2).all()

#以上是查询的,下面讲讲新增,删除和修改
#增加一条数据
obj = Category(cate_Name='新的笔记',cate_Order=0, cate_Count=0, cate_Alias='newbook', cate_Intro='', cate_RootID=0, cate_ParentID=0, cate_Template='', cate_LogTemplate='', cate_Meta='')
session.add(obj)
session.commit()

#增加多条数据
session.add_all([
    Category(cate_Name='新的笔记2',cate_Order=0, cate_Count=0, cate_Alias='newbook', cate_Intro='', cate_RootID=0, cate_ParentID=0, cate_Template='', cate_LogTemplate='', cate_Meta=''),
    Category(cate_Name='新的笔记3',cate_Order=0, cate_Count=0, cate_Alias='newbook', cate_Intro='', cate_RootID=0, cate_ParentID=0, cate_Template='', cate_LogTemplate='', cate_Meta=''),
    Category(cate_Name='新的笔记4',cate_Order=0, cate_Count=0, cate_Alias='newbook', cate_Intro='', cate_RootID=0, cate_ParentID=0, cate_Template='', cate_LogTemplate='', cate_Meta='')
])
session.commit()

#删除数据
session.query(Category).filter(Category.cate_ID>13).delete()
session.commit()

#修改数据
session.query(Category).filter(Category.cate_ID==13).update({"cate_Name":"测试笔记"})
session.commit()

#字段自增,常用浏览数等更新
session.query(Category).filter(Category.cate_ID==13).update({"cate_Order": Category.cate_Order+1})
session.commit()

#字段拼接新字符串
session.query(Category).filter(Category.cate_ID==13).update({"cate_Name": Category.cate_Name + "测试"}, synchronize_session=False)
session.commit()

以上需要注意的是filter和filter_by使用的场景,当使用多个条件的时候使用filter函数,参数需要对象+成员,条件中要等于要使用==,当使用filter_by的时候一般都是单条件查询,条件中等号使用=就行了。

all()查询返回的是一个list,list中包含对象列表,条用方式是,取列表索引值的成员

obj[index].member
#循环
for i in list:
    print(i.member)

使用first()查询直接返回对象,直接

obj.member即可获取到对象成员的值

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/610.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。