使用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:[email protected]/数据库名?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()    

原文地址:https://www.cnblogs.com/We612/p/12105135.html

时间: 2024-11-08 15:10:26

使用sqlalchemy对mysql进行增删改查的相关文章

Java连接MySQL数据库增删改查通用方法

Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类下面写好多方法,要是多个数据库,就要写多个类多个方法,导致代码编写太过于繁琐,所以为了改变这样的繁琐,我将连接数据库的方法进行了一系列的封装,使用户传入一个对象值Object就可以得到想要的. 我在之前写过一篇普通的Java连接MySQL数据库,大家可以看看,以便对比参考之后就知道差距了  数据库--MySQL-->Java篇 接下来我给大家讲讲如何将

mysql数据库增删改查

mysql数据库增删改查增:create database DBname charset gbk; 删:drop database DBname; 改:alter database DBname charset gbk; 改名:如下查:show databases;(show databases like '%name';)查:查看数据库定义:show create database 库名; (改名)百度了下大概就这三种方法: 1. RENAME DATABASE db_name TO new_

Mysql 常用增删改查命令集合教程

创建:create      插入:insert 更新:update  查询:select 删除:delete 修改:alter     销毁:drop 创建一个数据库: create database 数据库名 [其他选项]; create database `samp_db`;创建数据库表: create table 表名称(列声明); create table `students` ( `id` int unsigned not null auto_increment primary ke

MySQL---数据库从入门走上大神系列(二)-用Java对MySQL进行增删改查

上节已经学会对MySQL进行简单的增删改查了,那么,我们如何实现用Java来对数据库操作增删改呢. 本节将用Java演示对MySQL进行增删改查. 简单的来说,分为4个步骤: 1.加载连接器(驱动)   通过Driver类 (最好用类反射来加载,更加灵活) 2.建立与数据库的连接 3.获取语句对象 4.对数据库进行操作(增删改查) 其实第一步现在可以不用写了,高版本的MySQL已经在内部帮我们写好了第一步,但是,为了兼容性更好(兼容低版本的MySQL)我们最好还是写上第一步. 我们先看一下原数据

MySQL之增删改查之

MySQL之增删改查 前言:以下是MySQL最基本的增删改查语句,很多IT工作者都必须要会的命令,也是IT行业面试最常考的知识点,由于是入门级基础命令,所有所有操作都建立在单表上,未涉及多表操作. 前提:在进行“增删改查”的操作之前,先建立一个包含数据表student的数据库(具体操作可以见MySQL之最基本命令): 1.“增”——添加数据 1.1 为表中所有字段添加数据 1.1.1 INSERT 语句中指定所有字段名 语法:INSERT INTO 表名(字段名1,字段名2,…)   VALUE

使用MySQL练习增删改查时出现连接错误

使用MySQL练习增删改查时出现连接错误,错误提示如下: 2020-02-19 19:53:51.088 ERROR 16328 --- [reate-249798694] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://localhost:3306/springbootdata?useUnicode=true&useSSL=false&characterE

安卓版php服务器的mysql数据库增删改查简单案例

index.php文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html

jsp-2 简单的servlet连接mysql数据库 增删改查

连接mysql数据库的操作 有增删改查 用的包有 commons-lang3-3.5 mysql-connector-java-5.1.40-bin 但是实际上也就是 数据查询和数据处理两种 所以对数据库的操作DAO只有两种方法 package com.javaweb.dao; import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Re

安卓端通过http对Mysql进行增删改查

各类it学习视频,大家都可以看看哦!我自己本人都是通过这些来学习it只知识的! 下面是视频链接转自:http://www.cnblogs.com/wangying222/p/5492935.html https://shop61408405.taobao.com/?spm=a1z10.5-c.0.0.cAfZMN&qq-pf-to=pcqq.group Android通过Http连接MySQL 实现登陆/注册(数据库+服务器+客户端) 时间 2015-08-22 11:31:00 博客园-原创精