基于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中requests和https使用简单示例
Jan 18 Python
numpy中的高维数组转置实例
Apr 17 Python
儿童学习python的一些小技巧
May 27 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
pygame实现打字游戏
Feb 19 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
使用keras根据层名称来初始化网络
May 21 Python
Python gevent协程切换实现详解
Sep 14 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
Python 数据可视化之Bokeh详解
Nov 02 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
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
IE8 原生JSON支持
2009/04/13 Javascript
JavaScript 继承详解(四)
2009/07/13 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
js中的闭包学习心得
2018/02/06 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
Python中关键字is与==的区别简述
2014/07/31 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
生产厂厂长岗位职责
2013/12/25 职场文书
高校辅导员推荐信范文
2013/12/25 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
毕业生个人总结
2015/02/28 职场文书
余世维讲座观后感
2015/06/11 职场文书
房屋所有权证明
2015/06/19 职场文书
小学科学课教学反思
2016/02/23 职场文书
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python