基于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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Vue中key的作用示例代码详解
推荐阅读
-
python实现的MySQL增删改查操作实例小结
-
Python实现连接MySql数据库及增删改查操作详解
-
基于sqlalchemy对mysql实现增删改查操作
-
Java如何对MySQL进行增删改查操作?(初学者)
-
lucene全文检索实例二(实现对10万条数据检索文件的增删改查操作)
-
lucene全文检索实例二(实现对10万条数据检索文件的增删改查操作)
-
自写的利用PDO对mysql数据库增删改查操作类
-
express+mongoose实现对mongodb增删改查操作详解
-
运用Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat技术。实现用户信息的增删改查操作(添加功能及界面实现)。
-
nodejs操作mysql实现增删改查的实例