基于SQLAlchemy实现操作MySQL并执行原生sql语句


Posted in Python onJune 10, 2020

场景应用

老大我让爬取内部网站获取数据,插入到新建的表中,并每天进行爬取更新数据(后面做了定时任务)。然后根据该表统计每日的新增数量/更新数量进行制图制表,向上级汇报。

思路构建

选用sqlalchemy+mysqlconnector,连接数据库,创建表,对指定表进行CRUD

from sqlalchemy import exists, Column, Integer, String, ForeignKey, DateTime, Text, func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from conf.parseConfig import parseConf

# 从配置文件中获取数据库信息
host = parseConf.get_conf('MySQLInfo', 'host')
port = parseConf.get_conf('MySQLInfo', 'port')
dbname = parseConf.get_conf('MySQLInfo', 'dbname')
usernm = parseConf.get_conf('MySQLInfo', 'usernm')
passwd = parseConf.get_conf('MySQLInfo', 'passwd')
# 连接数据库
engine_str = "mysql+mysqlconnector://{0}:{1}@{2}:{3}/{4}".format(usernm, passwd, host, port, dbname)
# 创建的数据库引擎
engine = create_engine(engine_str, encoding='utf-8')

#创建session类型
DBSession = sessionmaker(bind=engine)
# 创建session对象,进行增删改查:
session = DBSession()

# 实例化官宣模型 - Base 就是 ORM 模型
Base = declarative_base()


# 创建服务单表 继承Base基类
class ServiceOrder(Base):
  __tablename__ = 'serviceOrderTable'
  serviceOrderId = Column(String(32), primary_key=True, comment='服务单ID')
  serviceDesc = Column(String(512), comment='服务说明')
  transferTimes = Column(String(32), comment='转派次数')
  # 创建更新时间,对数据的更新进行记录
  updateTime = Column(DateTime, server_default=func.now(), onupdate=func.now())


def init_db():
  Base.metadata.create_all(engine)


def drop_db():
  Base.metadata.drop_all(engine)


if __name__ == "__main__":
  # 每次执行时 会判断表的存在性 对于数据库中不存在的表进行创建 已存在的表则可以直接进行增删改查
  init_db()

  ### 首先讲一下使用sqlalchemy执行原生的sql语句###
  # 方式一:
  res = session.execute('select * from ServiceOrder') # res是获取的对象
  all_res_list = res.fetchall() # all_res_list具体的结果 是列表
  print(all_res_list ) # 结果: [('数据提取',), ('非数据提取',)]
  # 方式二:
  conn = engine.connect()
  res = conn.execute('select * from ServiceOrder') 
  all_res_list = res.fetchall()

  ### 使用创建好的session对象进行增删改查 ###
  # 插入单条数据
  # 创建新service0rder对象
  new_serviceorder = ServiceOrder(serviceOrderId='001', serviceDesc='ack', transferTimes='9')
  # 添加到session
  session.add(new_serviceorder)
  # 提交即保存到数据库
  session.commit()

  # 插入多条数据
  serviceorder_list = [ServiceOrder(serviceOrderId='002', serviceDesc='好的', transferTimes='9'),ServiceOrder(serviceOrderId='003', serviceDesc='起床', transferTimes='9')]
  session.add_all(serviceorder_list)
  session.commit()
  # session.close()

  # 查询
  # 查询是否存在 结果是布尔值
  it_exists = session.query(
    exists().where(ServiceOrder.serviceOrderId == '002')
  ).scalar()
  # 创建Query查询,filter是where条件
  # 调用one() first()返回唯一行,如果调用all()则已列表的形式返回所有行:
  server_order = session.query(ServiceOrder).filter(ServiceOrder.serviceOrderId == '003').first()
  print(server_order.serviceDesc)
  serciceorders = session.query(ServiceOrder).filter(ServiceOrder.serviceDesc == '好的').all()

  # 改 更新数据
  # 数据更新,将值为Mack的serviceDesc修改为Danny
  update_obj = session.query(ServiceOrder).filter(ServiceOrder.serviceDesc == 'Mack').update({"serviceDesc": "Danny"})
  # 或则
  update_objp = session.query(ServiceOrder).filter(ServiceOrder.serviceDesc == 'Mack').first()
  update_objp.serviceDesc = 'Danny'
  session.commit()

  # 删除
  update_objk = session.query(ServiceOrder).filter(ServiceOrder.serviceDesc == 'Mack').delete()
  # 或则
  update_objkp = session.query(ServiceOrder).filter(ServiceOrder.serviceDesc == 'Mack').one()
  update_objkp.delete()
  session.commit()
  session.close()

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

Python 相关文章推荐
在Python中用has_key()方法查找键是否存在的教程
May 21 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
Python复数属性和方法运算操作示例
Jul 21 Python
在dataframe两列日期相减并且得到具体的月数实例
Jul 03 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
详解Python3之数据指纹MD5校验与对比
Jun 11 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
如何基于线程池提升request模块效率
Apr 18 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
浅谈Python中的模块
Jun 10 #Python
keras多显卡训练方式
Jun 10 #Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 #Python
keras 多gpu并行运行案例
Jun 10 #Python
Keras自定义IOU方式
Jun 10 #Python
Python实现在线批量美颜功能过程解析
Jun 10 #Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 #Python
You might like
PHP定时执行任务的3种方法详解
2015/12/21 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
js中关于String对象的replace使用详解
2011/05/24 Javascript
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
工作中个人的自我评价
2013/12/31 职场文书
期中考试后的反思
2014/02/08 职场文书
承诺书怎么写
2014/03/26 职场文书
党员个人对照检查材料
2014/10/01 职场文书
干部作风建设心得体会
2014/10/22 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python