• SQLAlchemy常用功能的简单总结(来自于官方文档)


    最近在学SQLAlchemy,看了官方文档,记录下最常用的功能,下面的内容都是关于懒加载(lazy loading)的,通俗来讲就是,通过SQLAlchemy改变数据库中的数据,不会立马将数据的改写(包含,创建,删除和更新,不包含查询)提交到数据库进行SQL执行,而是将改变记录下来,当遇到session.commit()时,会将改变一次性的提交到数据库中,在此之前可以使用回滚session.rollback()方法,清空当前Session中的记录的数据库改变。关于急加载(Eager Loading),相关知识,请查阅官方文档,比较短。

    一,创建模型以及获取句柄

    Create_Add_Date.py
    
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, Sequence, ForeignKey
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker, relationship
    
    engine = create_engine('sqlite:test.db', echo=True)
    # engine = create_engine('sqlite:///:memory:', echo=True)
    
    # 创建基类
    Base = declarative_base()
    
    
    # 创建映射
    class User(Base):
        __tablename__ = 'users'
    
        id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
        name = Column(String)
        gender = Column(String)
        age = Column(Integer)
        # 设置级联关系
        addresses = relationship("Address", bake_queries="user", cascade="all, delete, delete-orphan")
        def __repr__(self):
            return str(self.id)+"|"+self.name + "|" + self.gender + "|" + str(self.age)
    
    
    class Address(Base):
        __tablename__ = 'addresses'
    
        id = Column(Integer, primary_key=True)
        email_address = Column(String, nullable=False)
        # 设置外键
        user_id = Column(Integer, ForeignKey("users.id"))
        # 连接到User,引用名为addresses
        user = relationship("User", back_populates="addresses")
    
        def __repr__(self):
            return self.email_address + '|' + str(self.user_id)
    
    # 指定外键,创建数据库
    # User.addresses = relationship("Address", order_by=Address.id, back_populates="user")
    # Base.metadata.create_all(engine)
    
    
    # 拿到句柄
    Session = sessionmaker()
    Session.configure(bind=engine)
    
    if __name__ == '__main__':
        User.addresses = relationship("Address", order_by=Address.id, back_populates="user")
    
        # 生成实例
        users = [
            User(name="张三", gender="女", age=10, addresses=[
                Address(email_address="admin123@1.com"),
                Address(email_address="12@1.com")
            ]),
            User(name="王五", gender="男",age=12, addresses=[
                Address(email_address="1@1.com"),
                Address(email_address="ww@1.com")
            ]),
            User(name="张柳", gender="女", age=58, addresses=[
                Address(email_address="zl@1.com"),
                Address(email_address="zl.2@1.163")
            ]),
            User(name="德玛西亚", gender="男", age=66,addresses=[
                Address(email_address="admin123@1.163"),
                Address(email_address="12@1.162")
            ]),
            User(name="码流", gender="女", age=66,addresses=[
                Address(email_address="admin123@1.com"),
                Address(email_address="12@1.126")
            ]),
            User(name="王麻子", gender="男", age=66,addresses=[
                Address(email_address="admin123@1.com"),
                Address(email_address="11@1.com")
            ]),
            User(name="张三", gender="女", age=38,addresses=[
                Address(email_address="12345@1.com"),
                Address(email_address="12@1.com")
            ]),
            User(name="德玛西亚", gender="女", age=66,addresses=[
                Address(email_address="ad12313min123@1.com"),
                Address(email_address="12@1.com")
            ]),
        ]
        # user = User(name="张三", gender="女", age=10)
    #     user.addresses = [
    #         Address(email_address="1@1")
    #     ]
        #
        # 创建一个会话
        session = Session()
        #
        # # 添加数据
        # session.add(user)
        session.add_all(users)
    # user_resp = session.query(User).filter_by(name="张三").first()
    # user_resp.address = "德国"
    #
        # 将数据库的更改进行提交
        session.commit()
        # # print(user_resp)
    
    

    二,按条件查询,以及简单的过滤数据

    from SQLAlchemy.Create_Add_Date import Session, User
    from sqlalchemy import and_, or_, func
    
    
    session = Session()
    
    # for instance in session.query(User).order_by(User.id):
    #     print(instance.name, instance.address)
    
    
    # for instance in session.query(User.name, User.gender):
    #     print(instance.name, instance.gender)
    
    # for row in session.query(User, User.name).all():
    #     print(row.User, row.name)
    
    # 自定义列名
    # for row in session.query(User.name.label("name_col")).all():
    #     print(row.name_col)
    
    # 切片排序
    # for u in session.query(User).order_by(User.id)[1:2]:
    #     print(u)
    
    # 过滤
    # for u in session.query(User).filter_by(name="德玛西亚"):
    #     print(u)
    
    # 条件过滤---------------------------------------
    # for u in session.query(User).filter(User.name=='张三'):
    #     print(u)
    
    # 不区分大小写
    # for u in session.query(User).filter(User.name.comparator().ilike("%三")):
    #     print(u)
    # # 可能区分大小写
    # for u in session.query(User).filter(User.name.like("%三")):
    #     print(u)
    
    # in or not in 包含
    # for u in session.query(User).filter(User.name.in_(['张三', '李四'])):
    #     print(u)
    #
    # # 多重过滤(and)-----------------------------------------------
    # for u in session.query(User).filter(and_(User.name == "张三", User.gender=="女")):
    #     print(u)
    #
    # for u in session.query(User).filter(User.name == "张三", User.gender=="女"):
    #     print(u)
    #
    # # 也可连写多个filter来进行多重过滤
    #
    # # 多重过滤 or
    # for u in session.query(User).filter(or_(User.name == "张三", User.gender=="男")):
    #     print(u)
    
    # 计数
    # print(session.query(User).filter(or_(User.name == "张三", User.gender=="男")).count())
    # print(session.query(func.count(User.id)).scalar())
    # 分组并统计计数
    print(session.query(func.count(User.id), User.name).group_by(User.name).all())
    

    三,一对多Join查询

    from SQLAlchemy.Create_Add_Date import User, Address, Session
    from sqlalchemy.orm import relationship
    
    session = Session()
    User.addresses = relationship("Address", order_by=Address.id, back_populates="user")
    
    # 普通连接查询
    # for u, a in session.query(User, Address)
    #         .filter(User.id == Address.user_id)
    #         .filter(Address.email_address=="12@1.com"):
    #     print(u, a)
    
    # for u in session.query(User).join(Address, User.id==Address.user_id).all():
    #     print(u)
    for u , a in session.query(User, Address).join(Address, User.addresses).all():
        print(u, a)
    
    
    # # 特殊的查询
    # for u , a in session.query(User, Address).join(User.addresses).all():
    #     print(u, a)
    

    级联删除

    from SQLAlchemy.Create_Add_Date import Session, User
    from sqlalchemy import and_, or_, func
    
    
    session = Session()
    user = session.query(User).get(1)
    
    # 删除user
    session.delete(user)
    
    session.commit()
    
    
  • 相关阅读:
    【转载】ASP.NET MVC中Controller与View之间的数据传递总结
    [转载]ASP.NET MVC 2配置使用CKEditor编辑器
    一步一步学NUnit(1)
    js关闭窗口弹出对话框
    [转载]将ASP.NET MVC 2.0 部署在IIS6和IIS7上的教程
    [转载] HTTP MIME
    【转载】用ckeditor分页符结合正则表达式给文章分页
    ASP.NET MVC2中返回Json异常的解决办法
    CKEditor
    [转载].net下的生成静态页面并分页 .
  • 原文地址:https://www.cnblogs.com/jlxa162hhf/p/14161222.html
Copyright © 2020-2023  润新知