基于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实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
python 求定积分和不定积分示例
Nov 20 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 Python
python实现最短路径的实例方法
Jul 19 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 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实现的CSS更新类实例
2014/09/22 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
php链表用法实例分析
2015/07/09 PHP
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
Ajax基础知识详解
2017/02/17 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
python自动zip压缩目录的方法
2015/06/28 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
python实现双色球随机选号
2020/01/01 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
JD Sports西班牙:英国领先的运动服装公司
2020/01/06 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
自动化专业个人求职信范文
2013/12/30 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
服务宗旨标语
2014/07/01 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
公司人事管理制度
2015/08/05 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js