基于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中使用异常处理来判断运行的操作系统平台方法
Jan 22 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
Mar 31 Python
Python脚本实现虾米网签到功能
Apr 12 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
浅析Python语言自带的数据结构有哪些
Aug 27 Python
python脚本后台执行方式
Dec 21 Python
python数据分析:关键字提取方式
Feb 24 Python
关于Keras Dense层整理
May 21 Python
python 实现批量图片识别并翻译
Nov 02 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
浅谈python数据类型及其操作
May 25 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 获取百度的热词数据的代码
2012/02/18 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
Python变量访问权限控制详解
2019/06/29 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
会计电算化专业应届大学生求职信
2013/10/22 职场文书
会计与审计毕业生自荐信范文
2013/12/30 职场文书
教导处工作制度
2014/01/18 职场文书
校园文化建设方案
2014/02/03 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
教育见习报告范文
2014/11/03 职场文书
微观世界观后感
2015/06/10 职场文书
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL