zoukankan      html  css  js  c++  java
  • Python—sqlalchemy

    SQLAlchemy

      SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作。

    复制代码
    #Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作:
    '''
    MySQL-Python
        mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
     
    pymysql
        mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
     
    MySQL-Connector
        mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
     
    cx_Oracle
        oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
    '''
    复制代码

    1、使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 进行数据库操作。

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey,select
    metadata = MetaData()
    
    user = Table('pepole', metadata,
        Column('id', Integer, primary_key=True),
        Column('name', String(20)),
    )
    
    color = Table('color', metadata,
        Column('id', Integer, primary_key=True),
        Column('name', String(20)),
    )
    engine = create_engine("mysql+mysqldb://root:123456@172.16.8.47:3306/test" ,max_overflow=5)
    #metadata.create_all(engine)创建表
    
    conn = engine.connect()
    #--增
    #sql = user.insert().values(id=3, name='lisi')
    #conn.execute(sql)
    #conn.close()
    #--删
    #sql = user.delete().where(user.c.id == 1)
    #conn.execute(sql)
    #conn.close()
    #--改
    #sql = user.update().where(user.c.name == 'zhangsan').values(name='lisi')
    #conn.execute(sql)
    #conn.close()
    #--查
    #sql = select([user, ])
    #sql = select([user.c.id, ])
    #sql = select([user.c.name, color.c.name]).where(user.c.id==color.c.id)#查找user和color表中id相等的name
    #sql = select([user.c.name]).order_by(user.c.name)
    
    #result = conn.execute(sql)
    #print result.fetchall()
    复制代码

    2、使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    
    engine = create_engine("mysql+mysqldb://root:123456@192.168.0.110:3306/test" ,max_overflow=5)#echo=True显示过程
    
    Base = declarative_base()
    
    class Host(Base):
        __tablename__ = 'hosts'
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
    
    # 寻找Base的所有子类,按照子类的结构在数据库中生成对应的数据表信息
    Base.metadata.create_all(engine)
    复制代码

     增、删、改、查

    复制代码
    Session = sessionmaker(bind=engine)
    session = Session()
    #--------增
    u = Host(id=2, name='zhansgan')
    session.add(u)
    session.add_all([
                     Host(id=3, name='lisi'),
                     Host(id=4, name='wangwu')
         ])
    session.commit()
    复制代码
    #--------删
    session.query(Host).filter(Host.id > 2).delete()
    session.commit()
    #--------改
    session.query(Host).filter(Host.id == 2).update({'name' : "wangwu"})
    session.commit()
    复制代码
    #--------查
    result=session.query(Host).filter_by(id=2).first()#first()第一个 all()全部
    print result
    
    offs=session.query(Host).offset(1).all()#从第4条数据开始
    print(offs)
    
    ret = session.query(Host).order_by(Host.id).all()#排序
    ret = session.query(Host).order_by(Host.id)[0:3]#找出前3条记录
    
    print(ret)
    
    session.commit()
    复制代码
    query = session.query(Host.name)
    print query.all()
    print query.limit(1).all() # 最多返回 1 条记录
    print query.offset(1).all() # 从第 2 条记录开始返回
    print query.order_by(Host.name).all() # 排序
    print query.order_by(Host.name.desc()).all()

    filter其他常用功能:

    equals

    query.filter(User.name == 'ed')

    not equals

    query.filter(User.name != 'ed')

    LIKE:

    query.filter(User.name.like('%ed%'))

    IN:

    query.filter(User.name.in_(['ed', 'wendy', 'jack']))#在列表内存在就找出
    # works with query objects too:
    query.filter(User.name.in_(
          session.query(User.name).filter(User.name.like('%ed%'))
    ))#先找出符合%ed%的列表在判断是否在该列表内

    NOT IN:

    query.filter(~User.name.in_(['ed', 'wendy', 'jack']))

    IS NULL:

    query.filter(User.name == None)
    # alternatively, if pep8/linters are a concern
    query.filter(User.name.is_(None))

    IS NOT NULL:

    query.filter(User.name != None)
    # alternatively, if pep8/linters are a concern
    query.filter(User.name.isnot(None))

    AND:

    from sqlalchemy import and_
    
    query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))

    OR:

    from sqlalchemy import or_
    query.filter(or_(User.name == 'ed', User.name == 'wendy'))

    外键关联

    一对多的关联引用parent.relationship()

    复制代码
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
        group_id=Column(Integer,ForeignKey("group.id"))#关联
        group=relationship("Group",backref="group_list")#可以通过group获取Group表里的数据,backref:反向关联
    
    class Group(Base):
        __tablename__ = 'group'
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
    复制代码
    #在表Group插入两个组
    g1=Group(name="g1")
    g2=Group(name="g2")
    session.add_all([g1,g2])
    session.commit()
    复制代码
    #插入一个用户
    g1=session.query(Group).filter(Group.name=="g1").first()
    u = User(id=1, name='zhangsan',group_id=g1.id)
    session.add(u)
    
    #可以通过User表查看zhangsan在Group表里对应的组
    h=session.query(User).filter(User.name=="zhangsan").first()
    print(h.group.name)
    复制代码

    relationship()中的backref(反向关联)

    #查看g1组下有几个用户关联
    gg=session.query(Group).filter(Group.name=="g1").first()
    print(gg.group_list)

    join查询

    INNER JOIN:

    aa=session.query(User).join(User.group).all()
    print(aa)
    
    aa=session.query(User).join(User.group).filter(Group.name=="g1").all()#加条件
    print(aa)

    多对多关联查询(需创建一个中间表)

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String,ForeignKey,Table
    from sqlalchemy.orm import sessionmaker,relationship
    from sqlalchemy import create_engine
    
    engine = create_engine("mysql+mysqldb://root:123456@172.16.8.47:3306/test" ,max_overflow=5)#echo=True显示过程
    Base = declarative_base()
    
    #创建中间表,关联另外两个表
    HostGroup = Table("Host_Group",Base.metadata,
                      Column("host_id",ForeignKey("host.id"),primary_key=True),
                      Column("group_id",ForeignKey("group.id"),primary_key=True),
                      )
    
    class Host(Base):
        __tablename__ = 'host'
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
        #group_id=Column(Integer,ForeignKey("group.id"))
    
        group=relationship("Group",
                           secondary=HostGroup,#指定中间表的实例
                           backref="group_list")
        def __repr__(self):
            return "id:%s,name:%s"%(self.id,self.name)
    
    class Group(Base):
        __tablename__ = 'group'
        id = Column(Integer, primary_key=True)
        name = Column(String(50),unique=True,nullable=False)
    
        def __repr__(self):
            return "id:%s,name:%s"%(self.id,self.name)
    
    # 寻找Base的所有子类,按照子类的结构在数据库中生成对应的数据表信息
    Base.metadata.create_all(engine)
    复制代码

    创建组和主机

    复制代码
    Session = sessionmaker(bind=engine)
    session = Session()
    
    #创建组
    g1 = Group(name="g1")
    g2 = Group(name="g2")
    g3 = Group(name="g3")
    session.add_all([g1,g2,g3])
    
    #创建主机
    h1 = Host(name="172.0.0.1")
    h2 = Host(name="172.0.0.2")
    h3 = Host(name="172.0.0.3")
    session.add_all([h1,h2,h3])
    复制代码

    进行关联

    复制代码
    groups = session.query(Group).all()#找出所有组
    
    h1=session.query(Host).filter(Host.name=="172.0.0.1").first()#找出h1
        
    h2=session.query(Host).filter(Host.name=="172.0.0.2").first()#找出h2
    
    h1.group=groups#h1关联3个组
    h2.group=groups[1:-1]#h2关联两个组
    复制代码

    查询

    g1=session.query(Group).filter(Group.name=="g1").first()
    h2=session.query(Host).filter(Host.name=="172.0.0.1").first()
    
    print(g1.group_list)#查看g1组下有哪些主机
    print(h2.group)#查看172.0.0.1属于哪些组
  • 相关阅读:
    [Kotlin] Open Classes and Inheritance
    [Kotlin] Class
    [Kotlin] Reverse a List with downTo
    [Kotlin] Named loop
    [Kotlin] for loop
    [Kotlin] Array List ArrayList
    深度解读 java 线程池设计思想及源码实现
    源码实战 | 从线程池理论聊聊为什么要看源码
    自己实现一个简单的线程池
    死磕 java线程系列之自己动手写一个线程池(续)
  • 原文地址:https://www.cnblogs.com/ExMan/p/9807144.html
Copyright © 2011-2022 走看看