zoukankan      html  css  js  c++  java
  • SQLAlchemy增删改查 一对多 多对多

    今天来聊一聊Python的ORM框架SQLAlchemy 有些同学已经听说过这个框架的大名了,也听说了SQLAlchemy没有Django的Models好用

    1 创建数据表

    create_table.py

    # 1 导入基础模型
    from sqlalchemy.ext.declarative import declarative_base
    
    #2 创建ORM模型基类  实例化模型
    Base = declarative_base()
    
    #3 导入ORM对应数据库数据类型的字段
    from sqlalchemy import Column,Integer,String
    
    #4 创建ORM对象   # 当前的这个Object继承了Base也就是代表了Object继承了ORM的模型
    class User(Base):   # 相当于 Django Models中的 Model
        # 为Table创建名称
        __tablename__ = "user"
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(32),index = True)
    
    # 5 创建数据库连接
    from sqlalchemy import create_engine
    #注意 root后面的空白处填写密码
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/sqla?charset=utf8")
    #数据库连接创建完成
    
    
    
    #6 去数据库中创建与User所对应的数据表
    #去engine数据库中创建所有继承Base类的ORM对象     
    # Base 自动检索所有继承Base的ORM 对象 并且创建所有的数据表 Base.metadata.create_all(engine)

    2 增删改查操作

    2.1 增加数据

    #增加数据
    #1 创建数据库连接
    from create_table import engine
    
    #2 创建会话 ---打开数据库连接
    
    from sqlalchemy.orm import sessionmaker
    
    #3 创建回话窗口
    Session = sessionmaker(engine)
    
    # 4打开回话窗口
    db_session = Session()
    
    #单条数据的增加
    # #1 导入  首先导入之间做好的ORM 对象 User
    # from create_table import User
    #
    # #2 增加数据 add只能放一个对象 而add_all 里面放一个列表 也就是多个对象
    # user_obj = User(name='mlh')
    # db_session.add(user_obj)  #相当于Insert into
    #
    # #3 执行会话中的所有操作
    # db_session.commit()
    #
    # #4 关闭会话
    # db_session.close()
    
    
    #批量增加
    # from create_table import User
    #
    # db_session.add_all({
    #     User(name='猪猪'),
    #     User(name='花花'),
    #     User(name='乖乖'),
    # })
    #
    # db_session.commit()
    # db_session.close()
    
    
    #扩展  db_session可同时执行多条语句
    from create_table import User
    user1 = User(name='lala')
    user2 = User(name='dada')
    user3 = User(name='tata')
    
    db_session.add(user1)
    db_session.add(user2)
    db_session.add(user3)
    #这里的知识点就是db_session支持多条语句同时执行
    db_session.commit()
    db_session.close()
    

    2.2 查询数据

    #查询数据
    #会话窗口
    from sqlalchemy.orm import sessionmaker
    from create_table import engine
    #1 创建窗口
    Session = sessionmaker(engine)
    #2 打开回话窗口
    db_session = Session()
    
    # 1 简单查询
    # select * from table
    
    from create_table import User
    #查询出User表中的所有数据
    
    #注意 要是后面没有.all()  则打印出来的是一个sql语句  将所有的数据序列化成
    # user_sql = db_session.query(User)
    # print(user_sql)   #结果是
                      #SELECT user.id AS user_id, user.name AS user_name
                      # FROM user
    
    #注意.all()返回的是列表
    # user_list = db_session.query(User).all()
    # print(user_list) #这是一个列表
    #
    #
    # for row in user_list:
    #     print(row.id,row.name)
    #6 dada
    #5 lala
    #1 mlh
    #7 tata
    #4 乖乖
    #2 猪猪
    #3 花花
    
    #查询第一条数据
    # user = db_session.query(User).first()
    # print(user.id,user.name)
    
    
    
    #带条件的查询
    #方式一 filter
    # user_a = db_session.query(User).filter(User.id == 4).all()
    # print(user_a[0].id,user_a[0].name)
    
    
    # 方式二 filter_by
    # user_a = db_session.query(User).filter_by(id=4).first()
    # print(user_a.id,user_a.name)
    
    #
    # user_list = db_session.query(User).filter(User.id >= 4).all()
    # for row in user_list:
    #     print(row.id,row.name)
    
    
    #扩展 查看sql语句
    user_sql = db_session.query(User).filter(User.id >= 4)
    print(user_sql)
    
    #结果是 SELECT user.id AS user_id, user.name AS user_name FROM user WHERE user.id >= %(id_1)s
    

    2.3 修改数据

    #更新修改数据
    from create_table import engine,User
    from sqlalchemy.orm import sessionmaker
    
    # 1 创建会话窗口
    Session = sessionmaker(engine)
    # 2 打开会话窗口
    db_session = Session()
    
    #修改数据 (首先要查存出要修改的数据)
    #sql语句  update 'user' set 'name' = '666' where id =1
    # user_up = db_session.query(User).filter(User.name == "mlh").update({'name':'佩奇'})
    # print(user_up)  #打印出来的是受影响的行数  为1
    #
    # db_session.commit()
    # db_session.close()
    
    
    # 符合条件 就修改  这里有多个
    user_up = db_session.query(User).filter(User.id >= 5).update({'name':'小猪佩奇'})
    print(user_up)  #打印出来的是受影响的行数  为3
    db_session.commit()
    db_session.close()
    
    
    
    # commit 提交操作 除了查询 增加修改删除都要commit()操作
    

    2.4 删除数据

    from sqlalchemy.orm import sessionmaker
    from create_table import engine,User
    
    #1 创建会话窗口
    Session = sessionmaker(engine)
    
    #2 打开会话窗口
    db_session = Session()
    
    
    #删除操作  首先要查询出要删除的数据
    #sql语句 delete from user where id=5
    #删除一条数据
    # user_del = db_session.query(User).filter(User.id==5).delete()
    # print(user_del)
    #
    # db_session.commit()
    # db_session.close()
    
    #删除多条数据
    # user_del = db_session.query(User).filter(User.id >= 5).delete()
    # print(user_del)
    # db_session.commit()
    # db_session.close()
    
    #
    

    2.5 高级版查询操作

    #老规矩
    from create_table import User,engine
    from sqlalchemy.orm import sessionmaker
    
    Session = sessionmaker(engine)
    db_session = Session()
    
    # 查询数据表操作
    # and or
    from sqlalchemy.sql import and_ , or_
    ret = db_session.query(User).filter(and_(User.id > 3, User.name == '乖乖')).all()
    ret = db_session.query(User).filter(or_(User.id < 2, User.name == '乖乖')).all()
    
    # 查询所有数据
    r1 = db_session.query(User).all()
    
    # 查询数据 指定查询数据列 加入别名
    r2 = db_session.query(User.name.label('username'), User.id).first()
    print(r2.id,r2.username) # 15 NBDragon
    
    # 表达式筛选条件
    r3 = db_session.query(User).filter(User.name == "乖乖").all()
    
    # 原生SQL筛选条件
    r4 = db_session.query(User).filter_by(name='乖乖').all()
    r5 = db_session.query(User).filter_by(name='乖乖').first()
    
    # 字符串匹配方式筛选条件 并使用 order_by进行排序
    r6 = db_session.query(User).filter(text("id<:value and name=:name")).params(value=224, name='乖乖').order_by(User.id).all()
    
    #原生SQL查询
    r7 = db_session.query(User).from_statement(text("SELECT * FROM User where name=:name")).params(name='乖乖').all()
    
    # 筛选查询列
    # query的时候我们不在使用User ORM对象,而是使用User.name来对内容进行选取
    user_list = db_session.query(User.name).all()
    print(user_list)
    for row in user_list:
        print(row.name)
    
    # 别名映射  name as nick
    user_list = db_session.query(User.name.label("nick")).all()
    print(user_list)
    for row in user_list:
        print(row.nick) # 这里要写别名了
    
    # 筛选条件格式
    user_list = db_session.query(User).filter(User.name == "乖乖").all()
    user_list = db_session.query(User).filter(User.name == "乖乖").first()
    user_list = db_session.query(User).filter_by(name="乖乖").first()
    for row in user_list:
        print(row.nick)
    
    # 复杂查询
    from sqlalchemy.sql import text
    user_list = db_session.query(User).filter(text("id<:value and name=:name")).params(value=3,name="乖乖")
    
    # 查询语句
    from sqlalchemy.sql import text
    user_list = db_session.query(User).filter(text("select * from User id<:value and name=:name")).params(value=3,name="乖乖")
    
    # 排序 :
    user_list = db_session.query(User).order_by(User.id).all()
    user_list = db_session.query(User).order_by(User.id.desc()).all()
    for row in user_list:
        print(row.name,row.id)
    
    #其他查询条件
    """
    ret = session.query(User).filter_by(name='乖乖').all()
    ret = session.query(User).filter(User.id > 1, User.name == '乖乖').all()
    ret = session.query(User).filter(User.id.between(1, 3), User.name == '乖乖').all() # between 大于1小于3的
    ret = session.query(User).filter(User.id.in_([1,3,4])).all() # in_([1,3,4]) 只查询id等于1,3,4的
    ret = session.query(User).filter(~User.id.in_([1,3,4])).all() # ~xxxx.in_([1,3,4]) 查询不等于1,3,4的
    ret = session.query(User).filter(User.id.in_(session.query(User.id).filter_by(name='乖乖'))).all() 子查询
    from sqlalchemy import and_, or_
    ret = session.query(User).filter(and_(User.id > 3, User.name == '乖乖')).all()
    ret = session.query(User).filter(or_(User.id < 2, User.name == '乖乖')).all()
    ret = session.query(User).filter(
        or_(
            User.id < 2,
            and_(User.name == 'eric', User.id > 3),
            User.extra != ""
        )).all()
    # select * from User where id<2 or (name="eric" and id>3) or extra != "" 
    
    # 通配符
    ret = db_session.query(User).filter(User.name.like('e%')).all()
    ret = db_session.query(User).filter(~User.name.like('e%')).all()
    
    # 限制
    ret = db_session.query(User)[1:2]
    
    # 排序
    ret = db_session.query(User).order_by(User.name.desc()).all()
    ret = db_session.query(User).order_by(User.name.desc(), User.id.asc()).all()
    
    # 分组
    from sqlalchemy.sql import func
    
    ret = db_session.query(User).group_by(User.extra).all()
    ret = db_session.query(
        func.max(User.id),
        func.sum(User.id),
        func.min(User.id)).group_by(User.name).all()
    
    ret = db_session.query(
        func.max(User.id),
        func.sum(User.id),
        func.min(User.id)).group_by(User.name).having(func.min(User.id) >2).all()
    """
    
    # 关闭连接
    db_session.close()
    
    orm_select_more
    

    2.6 高级修改数据操作

    #高级版更新操作
    from create_table import User,engine
    from sqlalchemy.orm import sessionmaker
    
    Session = sessionmaker(engine)
    db_session = Session()
    
    #直接修改
    db_session.query(User).filter(User.id > 0).update({"name" : "099"})
    
    #在原有值基础上添加 - 1
    db_session.query(User).filter(User.id > 0).update({User.name: User.name + "099"}, synchronize_session=False)
    
    #在原有值基础上添加 - 2
    db_session.query(User).filter(User.id > 0).update({"age": User.age + 1}, synchronize_session="evaluate")
    db_session.commit()
    
    orm_update_more
    

    3 一对多的操作:ForeignKey

    3.1 创建数据表及其关系relationship:

    create_table_ForeignKey.py

    #一对多建表操作
    
    from sqlalchemy.ext.declarative import declarative_base
    Base = declarative_base()
    
    from sqlalchemy import Column,Integer,String,ForeignKey
    from sqlalchemy.orm import relationship
    
    class Student(Base):
        __tablename__ = "student"
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(32))
        school_id = Column(Integer,ForeignKey("school.id"))
    
        stu2sch = relationship("School",backref="sch2stu")
    
    
    
    
    class School(Base):
        __tablename__ = "school"
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(32))
    
    
    from sqlalchemy import create_engine
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/sqla?charset=utf8")
    
    Base.metadata.create_all(engine)
    

     3.2 基于relationship增加数据

    from sqlalchemy.orm import sessionmaker
    from create_table_ForeignKey import engine,Student,School
    
    #1 创建会话窗口
    Session = sessionmaker(engine)
    
    #2 打开会话窗口
    db_session = Session()
    
    # 3增加操作  添加数据
    # sch_obj = School(name="oldboybeijing")
    # db_session.add(sch_obj)
    # db_session.commit()
    
    #然后查询出刚刚添加的学校信息 在这个学校中添加相应的学生信息
    # sch = db_session.query(School).filter(School.name=="oldboybeijing").first()
    # stu_obj = Student(name='猪猪',school_id=sch.id)
    # db_session.add(stu_obj)
    # db_session.commit()
    # db_session.close()
    
    #2 正向添加数据
    stu_obj = Student(name='哒哒',stu2sch=School(name='oldboyshengzheng'))
    db_session.add(stu_obj)
    db_session.commit()
    db_session.close()
    
    
    #3 添加数据relationship版  反向添加
    # sch_obj = School(name='oldboyshanghai')
    # sch_obj.sch2stu = [Student(name='乖乖'),Student(name='哈哈')]
    # db_session.add(sch_obj)
    # db_session.commit()
    # db_session.close()
    

    3.3 基于relationship查询数据

    from sqlalchemy.orm import sessionmaker
    from create_table_ForeignKey import engine,Student,School
    
    #1 创建会话窗口
    Session = sessionmaker(engine)
    
    #2 打开会话窗口
    db_session = Session()
    
    
    #查询数据 relationship版 正向查询数据
    stu_obj = db_session.query(Student).all()
    print(stu_obj)
    
    for row in stu_obj:
        print(row.id,row.name,row.school_id,row.stu2sch.name)
    
    
    
    
    # 反向查询数据
    sch_obj = db_session.query(School).all()
    for school in sch_obj:
        for student in school.sch2stu:
            print(school.id,school.name,student.name)
    

    3.4 修改数据

    from sqlalchemy.orm import sessionmaker
    from create_table_ForeignKey import engine,Student,School
    
    #1 创建会话窗口
    Session = sessionmaker(engine)
    
    #2 打开会话窗口
    db_session = Session()
    
    # 修改数据
    sch = db_session.query(School).filter(School.name=="oldboyshanghai").first()
    db_session.query(Student).filter(Student.name=='哒哒').update({'school_id':sch.id})
    db_session.commit()
    db_session.close()
    

    3.5 删除数据

    from sqlalchemy.orm import sessionmaker
    from create_table_ForeignKey import engine,Student,School
    
    #1 创建会话窗口
    Session = sessionmaker(engine)
    
    #2 打开会话窗口
    db_session = Session()
    
    #删除数据
    
    sch = db_session.query(School).filter(School.name=='oldboyshanghai').first()
    db_session.query(Student).filter(Student.school_id == sch.id).delete()
    db_session.commit()
    db_session.close()
    

     

    4 多对多:ManyToMany

    4.1创建表基关系

    create_table_many.py

    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()
    
    from sqlalchemy.orm import relationship
    from sqlalchemy import Column,Integer,String,ForeignKey
    
    
    class Hotel(Base):
        __tablename__ ="hotel"
        id = Column(Integer,primary_key=True)
        girl_id =Column(Integer,ForeignKey('girl.id'))
        boy_id =Column(Integer,ForeignKey('boy.id'))
    
    
    class Girl(Base):
        __tablename__ = "girl"
        id =Column(Integer,primary_key=True)
        name= Column(String(32),index=True)
        #创建关系   
        boys = relationship("Boy",secondary ="hotel",backref = "girl2boy")
    
    
    class Boy(Base):
        __tablename__="boy"
        id = Column(Integer,primary_key = True)
        name = Column(String(32),index=True)
    
    
    
    from sqlalchemy import create_engine
    engine = create_engine("mysql+pymysql://root@127.0.0.1:3306/sqla?charset=utf8")
    
    Base.metadata.create_all(engine)
    

    curd_insert_many.py

    from create_table_many import engine,Hotel,Girl,Boy
    from sqlalchemy.orm import sessionmaker
    
    #1 创建窗口
    Session = sessionmaker(engine)
    db_session = Session()
    
    
    # 1 通过Girl添加Boy和Hotel数据 正向查询
    girl = Girl(name='姗姗')
    girl.boys =[Boy(name='吖吖')]
    db_session.commit()
    db_session.close()
    
    
    
    #2 通过Boy添加Girl数据   反向添加数据
    boy = Boy(name="哈哈")
    boy.girl2boy = [Girl(name="照照"),Girl(name="滴滴")]
    db_session.add(boy)
    db_session.commit()
    db_session.close()
    
    from create_table_many import engine,Boy,Girl,Hotel
    from sqlalchemy.orm import sessionmaker
    
    Session = sessionmaker(engine)
    db_session = Session()
    
    #1 查询数据
    1.通过Boy查询约会过的所有Girl
    hotel = db_session.query(Boy).all()
    for row in hotel:
        for row2 in row.girl2boy:
            print(row.name,row2.name)
    
    1.通过Girl查询约会过的所有Boy
    hotel = db_session.query(Girl).all()
    for row in hotel:
        for row2 in row.boys:
            print(row.name,row2.name)
            
    
  • 相关阅读:
    linux下操作mysql
    数据指标系列:电商数据分析指标体系总结V1.0
    技巧系列:电脑微信多开方法
    Excel可视化:柱状图与柱状对比图
    数据指标系列:销售数据分析指标体系总结V1.0
    Excel:数据分析excel函数总结
    一种很简单的按键判断方法
    开始VC
    altium designer 画板子的一些收获
    stm32通用定时器
  • 原文地址:https://www.cnblogs.com/mlhz/p/10396097.html
Copyright © 2011-2022 走看看