当前位置: 移动技术网 > IT编程>数据库>Mysql > 基于sqlalchemy对mysql实现增删改查操作

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

2020年06月14日  | 移动技术网IT编程  | 我要评论

需求场景:

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网