• SQLAlchemy


    SQLAlchemy:

        是一个基于Python实现的ORM框架,建立在DB API之上,使用关系对象映射进行数据库操作

    组成部分:

        .Engine 框架引擎

        .Connection Pooling 数据库连接池

        .Dialect 选择链接数据库的DB API种类

        .Schema/Type 架构和类型

        .SQL Expression Language SQL表达式语言

       

    1.执行原生SQL

        import time

        import threading

        import sqlalchemy

        from sqlalchemy import create_engine

        from sqlalchemy.engine.base import Engine

        

        engine = create_engine(

            "mysql+pymysql://root:123@127.0.0.1:3306/t1?charset=utf8",

            max_overflow=0,  # 超过连接池大小外最多创建的连接

            pool_size=5,  # 连接池大小

            pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错

            pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)

        )

        def task(arg):

            conn = engine.raw_connection()

            cursor = conn.cursor()

            cursor.execute(

                "select * from t1"

            )

            result = cursor.fetchall()

            cursor.close()

            conn.close()

        for i in range(20):

            t = threading.Thread(target=task, args=(i,))

            t.start()

           

    ORM:

    单表:

     class Users(Base):

         __tablename__ = 'users'

         id = Column(Integer, primary_key=True)

         name = Column(String(32), index=True, nullable=False)

         # email = Column(String(32), unique=True)

         # ctime = Column(DateTime, default=datetime.datetime.now)

         # extra = Column(Text, nullable=True)

         __table_args__ = (

             # UniqueConstraint('id', 'name', name='uix_id_name'),

             # Index('ix_id_name', 'name', 'email'),

         )

        

    一对多:

    class Hobby(Base):

         __tablename__ = 'hobby'

         id = Column(Integer, primary_key=True)

         caption = Column(String(50), default='篮球')

     class Person(Base):

         __tablename__ = 'person'

         nid = Column(Integer, primary_key=True)

         name = Column(String(32), index=True, nullable=True)

         hobby_id = Column(Integer, ForeignKey("hobby.id"))

         # 与生成表结构无关,仅用于查询方便

         hobby = relationship("Hobby", backref='pers')

    多对多:

    class Server2Group(Base):

        __tablename__ = 'server2group'

        id = Column(Integer, primary_key=True, autoincrement=True)

        server_id = Column(Integer, ForeignKey('server.id'))

        group_id = Column(Integer, ForeignKey('group.id'))

    class Group(Base):

        __tablename__ = 'group'

        id = Column(Integer, primary_key=True)

        name = Column(String(64), unique=True, nullable=False)

        # 与生成表结构无关,仅用于查询方便

        servers = relationship('Server', secondary='server2group', backref='groups')

    class Server(Base):

        __tablename__ = 'server'

        id = Column(Integer, primary_key=True, autoincrement=True)

        hostname = Column(String(64), unique=True, nullable=False)

    def init_db():

        """

        根据类创建数据库表

        :return:

        """

        engine = create_engine(

            "mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8",

            max_overflow=0,  # 超过连接池大小外最多创建的连接

            pool_size=5,  # 连接池大小

            pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错

            pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)

        )

        Base.metadata.create_all(engine)

    def drop_db():

        """

        根据类删除数据库表

        :return:

        """

        engine = create_engine(

            "mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8",

            max_overflow=0,  # 超过连接池大小外最多创建的连接

            pool_size=5,  # 连接池大小

            pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错

            pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)

        )

        Base.metadata.drop_all(engine)

    if __name__ == '__main__':

        drop_db()

        init_db()

       

    基本操作:

     import time

     import threading

     from sqlalchemy.ext.declarative import declarative_base

     from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index

     from sqlalchemy.orm import sessionmaker, relationship

     from sqlalchemy import create_engine

     from sqlalchemy.sql import text

     from db import Users, Hosts

     engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5)

     Session = sessionmaker(bind=engine)

     session = Session()

     # ################ 添加 ################

     """

     obj1 = Users(name="wupeiqi")

     session.add(obj1)

     session.add_all([

         Users(name="wupeiqi"),

         Users(name="alex"),

         Hosts(name="c1.com"),

     ])

     session.commit()

     """

     # ################ 删除 ################

     """

     session.query(Users).filter(Users.id > 2).delete()

     session.commit()

     """

     # ################ 修改 ################

     """

     session.query(Users).filter(Users.id > 0).update({"name" : "099"})

     session.query(Users).filter(Users.id > 0).update({Users.name: Users.name + "099"}, synchronize_session=False)

     session.query(Users).filter(Users.id > 0).update({"age": Users.age + 1}, synchronize_session="evaluate")

     session.commit()

     """

     # ################ 查询 ################

     """

     r1 = session.query(Users).all()

     r2 = session.query(Users.name.label('xx'), Users.age).all()

     r3 = session.query(Users).filter(Users.name == "alex").all()

     r4 = session.query(Users).filter_by(name='alex').all()

     r5 = session.query(Users).filter_by(name='alex').first()

     r6 = session.query(Users).filter(text("id<:value and name=:name")).params(value=224, name='fred').order_by(Users.id).all()

     r7 = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all()

     """

     session.close()

     # 条件

     ret = session.query(Users).filter_by(name='alex').all()

     ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()

     ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()

     ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()

     ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()

     ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()

     from sqlalchemy import and_, or_

     ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()

     ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()

     ret = session.query(Users).filter(

         or_(

             Users.id < 2,

             and_(Users.name == 'eric', Users.id > 3),

             Users.extra != ""

         )).all()

     # 通配符

     ret = session.query(Users).filter(Users.name.like('e%')).all()

     ret = session.query(Users).filter(~Users.name.like('e%')).all()

     # 限制

     ret = session.query(Users)[1:2]

     # 排序

     ret = session.query(Users).order_by(Users.name.desc()).all()

     ret = session.query(Users).order_by(Users.name.desc(), 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()

     # 连表

     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()   

    通过relationsh查询:

     engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8", max_overflow=0, pool_size=5)

     Session = sessionmaker(bind=engine)

     session = Session()

     # 添加

     """

     session.add_all([

         Hobby(caption='乒乓球'),

         Hobby(caption='羽毛球'),

         Person(name='张三', hobby_id=3),

         Person(name='李四', hobby_id=4),

     ])+

     person = Person(name='张九', hobby=Hobby(caption='姑娘'))

     session.add(person)

     hb = Hobby(caption='人妖')

     hb.pers = [Person(name='文飞'), Person(name='博雅')]

     session.add(hb)

     session.commit()

     """

     # 使用relationship正向查询

     """

     v = session.query(Person).first()

     print(v.name)

     print(v.hobby.caption)

     """

     # 使用relationship反向查询

     """

     v = session.query(Hobby).first()

     print(v.caption)

     print(v.pers)

     """

     session.close()

  • 相关阅读:
    2、react-生命周期1※※※
    4.vue class 绑定- model基础应用
    1.react的基础
    Leetcode 5429 数组中的 k 个最强值
    leetcode 21.合并两个有序链表(迭代)
    【Postman请求无响应】Can not get any response
    【PageHelper】插件不生效的原因及解决办法
    【fasterxml.jackson】字段(反)序列号问题Access.WRITE_ONLY
    【SpringCloud-Maven】依赖版本比对
    【Charles】抓包工具使用
  • 原文地址:https://www.cnblogs.com/mihon/p/8981025.html
Copyright © 2020-2023  润新知