zoukankan      html  css  js  c++  java
  • Python 中操作mysql,pymysql与sqlachemy

    1 pymysql的作用:

        pymysql是python的一个模块,作用是基本的做到在python里边与mysql数据库连接与操作。

    2 pyMySQL的安装:

      pip install pymysql

    3 pymysql在什么情景下使用:

      一般在其他较复杂的模块中起到基础的作用,算是底层建筑

    4 pymysql使用方法:

       1 执行sql语句

      import pymysql  

      # 创建连接
      conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1',charset='utf8')
      # 创建游标
      cursor = conn.cursor()  
      # 执行SQL,并返回收影响行数
      effect_row = cursor.execute("update hosts set host = '1.1.1.2'")  
      # 执行SQL,并返回受影响行数
      effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))  
      # 执行SQL,并返回受影响行数
      try: # 执行sql语句
        cursor.execute(sql) # 提交到数据库执行   
        conn.commit()
      except: # 如果发生错误则回滚
        conn.rollback()
      effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])    
      # 提交,不然无法保存新建或者修改的数据
      conn.commit()
      # 关闭游标
      cursor.close()
      # 关闭连接
      conn.close()
     

      2 获取新创建数据自增ID    

        # 获取最新自增ID
        new_id = cursor.lastrowid
     
      3 获取查询的数据
        # 获取第一行数据
        row_1 = cursor.fetchone()  
        # 获取前n行数据
        row_2 = cursor.fetchmany(3)
        # 获取所有数据
        row_3 = cursor.fetchall()
        

        cursor.scroll(1,mode='relative')  # 相对当前位置移动

        cursor.scroll(2,mode='absolute')  # 相对绝对位置移动

      4 获取时的数据类型变更
        # 游标设置为字典类型
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
     

     sqlachemy模块

      1 基本说明  

           SQLAlchemy是python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,

    然后使用数据API执行SQL并获取执行结果。实现简单高效地管理大量网络化数据;实现信息资源的有效发现、查找、一体化组织和对使用资源的有效管理。

       SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,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...]
       
     

            2  sqlachemy通过pymysql操作数据库语法:

        

    from sqlalchemy import create_engine
    #使用pymysql与数据库建立连接 engine
    = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
    # 执行SQL
    cur = engine.execute("INSERT INTO hosts (host, color_id) VALUES ('1.1.1.22', 3)" )
    #以列表形式插入参数
    cur = engine.
    execute(
    "INSERT INTO hosts (host, color_id) VALUES(%s, %s)",[('1.1.1.22', 3),('1.1.1.221', 3),])
     # 获取第一行数据
     cur.fetchone()
     # 获取第n行数据
     cur.fetchmany(3)
     # 获取所有数据
     cur.fetchall()
    # 新插入行自增ID
    cur.lastrowid

       3  ORM功能使用

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

        ORM分两类,一类时db first,一类是code first,sqlachemy就是code first。

        

    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
    
    engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
    
    Base = declarative_base()
    
    # 创建单表
    class Users(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        extra = Column(String(16))
    
        __table_args__ = (
        UniqueConstraint('id', 'name', name='uix_id_name'),
            Index('ix_id_name', 'name', 'extra'),
        )
    
        def __repr__(self):
            return "%s-%s" %(self.id, self.name)
    
    # 一对多
    class Favor(Base):
        __tablename__ = 'favor'
        nid = Column(Integer, primary_key=True)
        caption = Column(String(50), default='red', unique=True)
    
        def __repr__(self):
            return "%s-%s" %(self.nid, self.caption)
    
    class Person(Base):
        __tablename__ = 'person'
        nid = Column(Integer, primary_key=True)
        name = Column(String(32), index=True, nullable=True)
        favor_id = Column(Integer, ForeignKey("favor.nid"))
        # 与生成表结构无关,仅用于查询方便
        favor = relationship("Favor", backref='pers')
    
    # 多对多
    class ServerToGroup(Base):
        __tablename__ = 'servertogroup'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        server_id = Column(Integer, ForeignKey('server.id'))
        group_id = Column(Integer, ForeignKey('group.id'))
        group = relationship("Group", backref='s2g')
        server = relationship("Server", backref='s2g')
    
    class Group(Base):
        __tablename__ = 'group'
        id = Column(Integer, primary_key=True)
        name = Column(String(64), unique=True, nullable=False)
        port = Column(Integer, default=22)
        # group = relationship('Group',secondary=ServerToGroup,backref='host_list')
    
    
    class Server(Base):
        __tablename__ = 'server'
    
        id = Column(Integer, primary_key=True, autoincrement=True)
        hostname = Column(String(64), unique=True, nullable=False)
    
    
    
    
    def init_db():
        Base.metadata.create_all(engine)
    
    
    def drop_db():
        Base.metadata.drop_all(engine)
    
    
    Session = sessionmaker(bind=engine)
    session = Session()

        增

    obj = Users(name="alex0", extra='sb')
    session.add(obj)
    session.add_all([
        Users(name="alex1", extra='sb'),
        Users(name="alex2", extra='sb'),
    ])
    session.commit()

        删

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

        改

    session.query(Users).filter(Users.id > 2).update({"name" : "099"})
    session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)
    session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")
    session.commit()

        查

    ret = session.query(Users).all()
    ret = session.query(Users.name, Users.extra).all()
    ret = session.query(Users).filter_by(name='alex').all()
    ret = session.query(Users).filter_by(name='alex').first()
    
    ret = session.query(Users).filter(text("id<:value and name=:name")).params(value=224, name='fred').order_by(User.id).all()
    
    ret = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all()

        其他

    # 条件
    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()
  • 相关阅读:
    627. Swap Salary
    176. Second Highest Salary
    596. Classes More Than 5 Students
    183. Customers Who Never Order
    181. Employees Earning More Than Their Managers
    182. Duplicate Emails
    175. Combine Two Tables
    620. Not Boring Movies
    595. Big Countries
    HDU 6034 Balala Power! (贪心+坑题)
  • 原文地址:https://www.cnblogs.com/yuanji2018/p/9727064.html
Copyright © 2011-2022 走看看