需求场景:
老大让我利用爬虫爬取的数据写到或更新到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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
网友评论