基于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爬虫之打包生成exe文件
Nov 06 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
Python中title()方法的使用简介
May 20 Python
python简单分割文件的方法
Jul 30 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
利用pyshp包给shapefile文件添加字段的实例
Dec 06 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
windows下的pycharm安装及其设置中文菜单
Apr 23 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 Python
python中append函数用法讲解
Dec 11 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
Zend 输出产生XML解析错误
2009/03/03 PHP
php常用的安全过滤函数集锦
2014/10/09 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
Dojo 学习要点
2010/09/03 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
从零学Python之hello world
2014/05/21 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
Python数据结构之单链表详解
2017/09/12 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
基于Python解密仿射密码
2019/10/21 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
python中format函数如何使用
2020/06/22 Python
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
美国旅游网站:Tours4Fun
2017/02/17 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
销售行政专员岗位职责
2014/06/10 职场文书
超市店庆活动方案
2014/08/31 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
JavaScript设计模式之原型模式详情
2022/06/21 Javascript