• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    基于sqlalchemy对mysql实现增删改查操作

    需求场景:

    老大让我利用爬虫爬取的数据写到或更新到mysql数据库中,百度了两种方法

    1 是使用pymysql连接mysql,通过操作原生的sql语句进行增删改查数据;

    2 是使用sqlalchemy连接mysql,通过ORM模型建表并操作数据库,不需要写原生的sql语句,相对简单些;

    以下就是本次使用sqlalchemy的经验之谈。

    实现流程:连接数据库》通过模型类创建表》建立会话》执行创建表语句》通过会话进行增删改查

    from sqlalchemy import exists, Column, Integer, String, ForeignKey, exists
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    # 创建的数据库引擎
    engine = create_engine("mysql+pymysql://user:pwd@ip/数据库名?charset=utf8")
    
    #创建session类型
    DBSession = sessionmaker(bind=engine)
    
    # 实例化官宣模型 - Base 就是 ORM 模型
    Base = declarative_base()
    
    
    # 创建服务单表
    class ServiceOrder(Base):
      __tablename__ = 'serviceOrderTable'
      id = Column(Integer, primary_key=True, autoincrement=True)
      serviceOrderId = Column(String(32), nullable=False, index=True, comment='服务单ID')
      serviceDesc = Column(String(268), comment='服务说明')
      oneLevelName = Column(String(32), comment='C类别')
      twoLevelName = Column(String(32), comment='T子类')
      threeLevelName = Column(String(32), comment='I项目')
      fourLevelName = Column(String(32), comment='S子项')
      transferTimes = Column(String(32), comment='转派次数')
      overDueStatus = Column(String(32), comment='过期状态')
      serviceTimeLimit = Column(String(32), comment='服务时限')
      serTimeLimitTypeName = Column(String(16), comment='时限类型')  
      # 一对多:
      # serviceWorkOrder = relationship("ServiceWorkOrder", backref="serviceorder")
    
    
    # 多对一:多个服务工单可以属于服务单
    class ServiceWorkOrder(Base):
      __tablename__ = 'serviceWorkOrderTable'
      id = Column(Integer, primary_key=True, autoincrement=True)
      serviceWorkOrderId = Column(String(32), nullable=False, index=True, comment='服务工单ID')
      workOrderName = Column(String(268), comment='工单名称')
      fromId = Column(String(32), comment='服务单ID')
      createUserSectionName = Column(String(32), comment='创建人室')
      createUserName = Column(String(32), comment='创建人')
      handlerName = Column(String(32), comment='处理人')
      statusName = Column(String(32), comment='工单状态')
      createTime = Column(String(32), comment='创建时间') 
      # “多”的一方的book表是通过外键关联到user表的:
      # serviceOrder_id = Column(Integer, ForeignKey('serviceOrderTable.id'))
    
    # 创建数据库 如果数据库已存在 则不会创建 会根据库名直接连接已有的库
    def init_db():
      Base.metadata.create_all(engine)
    
    def drop_db():
      Base.metadata.drop_all(engine)
    
    def insert_update():
      # all_needed_data_lists 是需要插入数据库的数据 格式[{key: value, ... }, { }, { }...]
      for item in all_needed_data_lists:
        ServiceOrderRow = ServiceOrder(serviceOrderId=item['serviceOrderId'],
                        serviceDesc=item['serviceDesc'],
                        oneLevelName=item['oneLevelName'],
                        twoLevelName=item['twoLevelName'],
                        threeLevelName=item['threeLevelName'],
                        fourLevelName=item['fourLevelName'],
                        transferTimes=item['transferTimes'],
                        overDueStatus=item['overDueStatus'],
                        serviceTimeLimit=item['serviceTimeLimit'],
                        serTimeLimitTypeName=item['serTimeLimitTypeName'],
                        )
        try:
          # 利用exists判断目标对象是否存在,返回True或Faults
          it_exists = session.query(
              exists().where(ServiceOrder.serviceOrderId == item['serviceOrderId'] )
            ).scalar()
        except Exception as e:
          self.log.error(e)
          break
        try:
          # 如果不存在,进行新增;存在的话就更新现存的数据
          if not it_exists:
            session.add(ServiceOrderRow)
          else:
            session.query(ServiceOrder).filter(ServiceOrder.serviceOrderId == item['serviceOrderId'])\
    
              .update(item)
        except Exception as e:
          self.log.error(e)
          break
      try:
        session.commit()
        self.log.info('数据更新成功!')
      except:
        session.rollback()
        self.log.info('数据更新失败!')
    
    if __name__ == "__main__":
      # 创建数据库 如果数据库已存在 则不会创建 会根据库名直接连接已有的库
      init_db()
      # 创建session对象,进行增删改查:
      session = DBSession()
      # 利用session 增 改数据 记得提交
      insert_update()  

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 基于SQLAlchemy实现操作MySQL并执行原生sql语句
    • python数据库操作mysql:pymysql、sqlalchemy常见用法详解
    • python orm 框架中sqlalchemy用法实例详解
    • python使用SQLAlchemy操作MySQL
    • Python SQLAlchemy入门教程(基本用法)
    • python SQLAlchemy的Mapping与Declarative详解
    • python SQLAlchemy 中的Engine详解
    • Python流行ORM框架sqlalchemy安装与使用教程
    • python 获取sqlite3数据库的表名和表字段名的实例
    • Python_查看sqlite3表结构,查询语句的示例代码
    • python使用sqlite3时游标使用方法
    • Python SQLite3简介
    • Python使用flask框架操作sqlite3的两种方式
    • python与sqlite3实现解密chrome cookie实例代码
    • Python SQLite3数据库日期与时间常见函数用法分析
    • Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
    • Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
    • Python sqlite3事务处理方法实例分析
    • Python简单操作sqlite3的方法示例
    • Python3+SQLAlchemy+Sqlite3实现ORM教程
    上一篇:MySQL数据库备份恢复实现代码
    下一篇:MySQL 8.0.20 Window10免安装版配置及Navicat管理教程图文详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    基于sqlalchemy对mysql实现增删改查操作 基于,sqlalchemy,对,mysql,实现,