基于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定时器使用示例分享
Feb 16 Python
使用python 获取进程pid号的方法
Mar 10 Python
Python异常学习笔记
Feb 03 Python
python 远程统计文件代码分享
May 14 Python
python字符串的常用操作方法小结
May 21 Python
Python实现的读写json文件功能示例
Jun 05 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
python中68个内置函数的总结与介绍
Feb 24 Python
解决django接口无法通过ip进行访问的问题
Mar 27 Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 Python
Python实现疫情地图可视化
Feb 05 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的FTP学习(三)
2006/10/09 PHP
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
php中http_build_query 的一个问题
2012/03/25 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
2014/10/15 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
经验几则 推荐
2006/09/05 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
详解vue 命名视图
2019/08/14 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
Python中set与frozenset方法和区别详解
2016/05/23 Python
python实现简易内存监控
2018/06/21 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
Python3获取cookie常用三种方案
2020/10/05 Python
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
PHP两种查询函数array/row的区别
2013/06/03 面试题
个人求职信范例
2014/01/29 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis
为什么RedisCluster设计成16384个槽
2021/09/25 Redis