基于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 相关文章推荐
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
python中os模块详解
Oct 14 Python
Django基础之Model操作步骤(介绍)
May 27 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 Python
tensorflow识别自己手写数字
Mar 14 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 Python
python 实现批量图片识别并翻译
Nov 02 Python
opencv 分类白天与夜景视频的方法
Jun 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 IP转换整形(ip2long)的详解
2013/06/06 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
python使用itchat实现手机控制电脑
2018/02/22 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
教师党员公开承诺书
2014/03/25 职场文书
奥巴马连任演讲稿
2014/05/15 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
先进教师事迹材料
2014/12/16 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
Python中json.dumps()函数的使用解析
2021/05/17 Python