• SQLAlchemy


    一、介绍

    基于Python语言,是Python的一个ORM框架,ORM将对象的各个方法翻译成SQL语句,通过DB-API执行。

    DB-API : 是Python的数据库接口规范

     

    二、下载

    pip install sqlalchemy

     

    三、单表的创建

    # 导入SQLAlchemy
    from sqlalchemy import Column,String,Integer
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    
    # 创建对象的基类
    Base = declarative_base()
    
    # 初始化数据库连接
    engine = create_engine(
        "mysql+pymysql://root:@127.0.0.1:3306/mysqlalchemydb?charset=utf8",
        max_overflow = 0,   # 超过连接池大小外最多创建的连接数
        pool_size = 5,      # 连接池大小
        pool_timeout = 30,  # 连接池中没有线程最多等待时间,否则报错
        pool_recycle = -1   # 多久之后对连接池中的连接进行回收(重置)-1不回收
    )
    
    class Book(Base):
        # 表的名字
        __tablename__ = 'book'
    
        # 表的结构
        id = Column(Integer,primary_key=True)
        title = Column(String(32),nullable=True)
    
    if __name__ == '__main__':
        # 创建表
        Base.metadata.create_all(engine)
        
        # 删除表
        Base.metadata.drop_all(engine)

    四、一对多的创建和数据添加

    # 导入SQLAlchemy
    from sqlalchemy import Column,String,Integer,ForeignKey
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship
    
    
    # 创建对象的基类
    Base = declarative_base()
    
    # 初始化数据库连接
    engine = create_engine(
        "mysql+pymysql://root:@127.0.0.1:3306/mysqlalchemydb?charset=utf8",
        max_overflow = 0,   # 超过连接池大小外最多创建的连接数
        pool_size = 5,      # 连接池大小
        pool_timeout = 30,  # 连接池中没有线程最多等待时间,否则报错
        pool_recycle = -1   # 多久之后对连接池中的连接进行回收(重置)-1不回收
    )
    
    class Book(Base):
        # 表的名字
        __tablename__ = 'book'
    
        # 表的结构
        id = Column(Integer,primary_key=True)
        title = Column(String(32),nullable=True)
        publisher_id = Column(Integer,ForeignKey("publisher.id"))
    
        # relationship 不生成字段建立关系,用于操作
        # backref 反向查询的字段
        publisher = relationship("Publisher",backref="books")
    
    class Publisher(Base):
        # 表的名字
        __tablename__ = 'publisher'
    
        # 表的结构
        id = Column(Integer,primary_key=True)
        title = Column(String(32),nullable=True)
    
    
    
    from sqlalchemy.orm import sessionmaker,scoped_session
    # 绑定数据库连接,生成管理器对象,但是线程不安全
    Session = sessionmaker(bind=engine)
    
    # 重新创造对象保证线程安全
    session = scoped_session(Session)
    
    # # 创建表
    Base.metadata.create_all(engine)
    # # 删除表
    # Base.metadata.drop_all(engine)
    
    
    # 生成对象,并用外键id创建数据
    publisher_obj = Publisher(title="深圳出版社")
    book_obj = Book(title="数学之美",publisher_id=1)    # 存放外键的id
    session.add(publisher_obj)
    session.commit()
    session.close()
    
    
    # # 生成对象,并用外键对象创建数据
    publisher_obj = Publisher(title="上海出版社")
    book_obj = Book(title="语文之美",publisher=publisher_obj)    # 存放外键的id
    session.add(publisher_obj)
    session.commit()
    session.close()

    五、多对多关系表的创建

    # 导入SQLAlchemy
    from sqlalchemy import Column,String,Integer,ForeignKey,UniqueConstraint
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship
    
    
    # 创建对象的基类
    Base = declarative_base()
    
    # 初始化数据库连接
    engine = create_engine(
        "mysql+pymysql://root:@127.0.0.1:3306/mysqlalchemydb?charset=utf8",
        max_overflow = 0,   # 超过连接池大小外最多创建的连接数
        pool_size = 5,      # 连接池大小
        pool_timeout = 30,  # 连接池中没有线程最多等待时间,否则报错
        pool_recycle = -1   # 多久之后对连接池中的连接进行回收(重置)-1不回收
    )
    
    class Book(Base):
        # 表的名字
        __tablename__ = 'book'
    
        # 表的结构
        id = Column(Integer,primary_key=True)
        title = Column(String(32),nullable=True)
    
        # relationship 不生成字段建立关系,用于操作
        # backref 反向查询的字段
        # secondary 关联第三张表
        tags = relationship("Tag",backref="books",secondary="book2tag")
    
        # 只有__repr__,面向开发人员
        def __repr__(self):
            return self.title
    
    class Tag(Base):
        __tablename__ = "tag"
    
        id = Column(Integer, primary_key=True)
        title = Column(String(32), nullable=True)
    
        # 只有__repr__,面向开发人员
        def __repr__(self):
            return self.title
    
        __table_args__ = (
            # 联合唯一
            UniqueConstraint("id","title",name="uni_id_title"),
        )
    # 多对多关系关联的表
    class Book2Tag(Base):
        __tablename__ = "book2tag"
    
        id = Column(Integer,primary_key=True)
        book_id = Column(Integer,ForeignKey("book.id"))
        tag_id = Column(Integer,ForeignKey("tag.id"))
    
    
    
    from sqlalchemy.orm import sessionmaker,scoped_session
    # 绑定数据库连接,生成管理器对象,但是线程不安全
    Session = sessionmaker(bind=engine)
    
    # 重新创造对象保证线程安全
    session = scoped_session(Session)
    
    # # 创建表
    Base.metadata.create_all(engine)
    # # 删除表
    # Base.metadata.drop_all(engine)

    六、基本操作

    # 导入SQLAlchemy
    from sqlalchemy import Column,String,Integer,ForeignKey,UniqueConstraint
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship
    
    
    # 创建对象的基类
    Base = declarative_base()
    
    # 初始化数据库连接
    engine = create_engine(
        "mysql+pymysql://root:@127.0.0.1:3306/mysqlalchemydb?charset=utf8",
        max_overflow = 0,   # 超过连接池大小外最多创建的连接数
        pool_size = 5,      # 连接池大小
        pool_timeout = 30,  # 连接池中没有线程最多等待时间,否则报错
        pool_recycle = -1   # 多久之后对连接池中的连接进行回收(重置)-1不回收
    )
    
    class Book(Base):
        # 表的名字
        __tablename__ = 'book'
    
        # 表的结构
        id = Column(Integer,primary_key=True)
        title = Column(String(32),nullable=True)
    
        # relationship 不生成字段建立关系,用于操作
        # backref 反向查询的字段
        # secondary 关联第三张表
        tags = relationship("Tag",backref="books",secondary="book2tag")
    
        # 只有__repr__,面向开发人员
        def __repr__(self):
            return self.title
    
    class Tag(Base):
        __tablename__ = "tag"
    
        id = Column(Integer, primary_key=True)
        title = Column(String(32), nullable=True)
    
        # 只有__repr__,面向开发人员
        def __repr__(self):
            return self.title
    
        __table_args__ = (
            # 联合唯一
            UniqueConstraint("id","title",name="uni_id_title"),
        )
    # 多对多关系关联的表
    class Book2Tag(Base):
        __tablename__ = "book2tag"
    
        id = Column(Integer,primary_key=True)
        book_id = Column(Integer,ForeignKey("book.id"))
        tag_id = Column(Integer,ForeignKey("tag.id"))
    
    
    
    from sqlalchemy.orm import sessionmaker,scoped_session
    # 绑定数据库连接,生成管理器对象,但是线程不安全
    Session = sessionmaker(bind=engine)
    
    # 重新创造对象保证线程安全
    session = scoped_session(Session)
    表结构准备

    增:

    # 添加
    tag_obj = Tag(title="基础")
    tag_obj2 = Tag(title="进阶")
    tag_obj3 = Tag(title="高级")
    
    session.add(tag_obj)            # 添加单个
    session.add_all([tag_obj2,tag_obj3])    # 批量添加
    
    session.commit()        # 提交
    session.close()         # 关闭session

    查:

    # 查询
    ret1 = session.query(Tag).all()
    print(ret1)     # [基础, 进阶, 高级]
    ret2 = session.query(Tag).filter(Tag.id == 2).first()
    ret3 = session.query(Tag).filter_by(id=3).first()
    print(ret2)     # 进阶
    print(ret3)     # 高级

    改:

    # 修改
    session.query(Tag).filter_by(id=1).update({"title":"python"})
    session.query(Tag).filter_by(id=2).update({Tag.title:"Linux"})
    session.commit()        # 提交
    session.close()         # 关闭

    删:

    # 删除
    session.query(Tag).filter_by(id=3).delete()
    session.commit()
    session.close()

     

  • 相关阅读:
    spring @component的作用详细介绍
    @Scheduled(cron = "0/5 * * * * *")将时间改为配置
    java项目里classpath具体指哪儿个路径
    返回前多少行数据
    Gson的基本使用
    JSON.toJSONString中序列化空字符串遇到的坑
    指定JSON.toJSONString中实体类属性的输出顺序
    Javascript实现的图片隐写术
    IntelliJ IDEA 快捷键终极大全
    ECMAScript 6 入门
  • 原文地址:https://www.cnblogs.com/st-st/p/10210605.html
Copyright © 2020-2023  润新知