基于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基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
python中的lambda表达式用法详解
Jun 22 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
完美解决python3.7 pip升级 拒绝访问问题
Jul 12 Python
python 自定义装饰器实例详解
Jul 20 Python
Python 元组操作总结
Sep 18 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
Pytorch 神经网络—自定义数据集上实现教程
Jan 07 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 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函数的常用方法及注意之处小结
2011/07/10 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
使用python 获取进程pid号的方法
2014/03/10 Python
Python实现CET查分的方法
2015/03/10 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
花卉与景观设计系大学生求职信
2013/10/01 职场文书
十佳班主任事迹材料
2014/01/18 职场文书
小区门卫管理制度
2014/01/29 职场文书
二年级学生评语大全
2014/04/23 职场文书
社区科普工作方案
2014/06/03 职场文书
学生干部培训方案
2014/06/12 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
信访工作汇报材料
2014/10/27 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书