欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-11-22 16:07:03
需求场景:老大让我利用爬虫爬取的数据写到或更新到mysql数据库中,百度了两种方法1 是使用pymysql连接mysql,通过操作原生的sql语句进行增删改查数据;2 是使用sqlalchemy连接m...

需求场景:

老大让我利用爬虫爬取的数据写到或更新到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()  

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