基于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基础教程之常用运算符
Aug 29 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
python基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
Python 类的继承实例详解
Mar 25 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
Python 统计字数的思路详解
May 08 Python
基于python 爬虫爬到含空格的url的处理方法
May 11 Python
python实现自动获取IP并发送到邮箱
Dec 26 Python
简单了解python反射机制的一些知识
Jul 13 Python
pygame实现飞机大战
Mar 11 Python
Python实现自动整理文件的脚本
Dec 17 Python
利用python绘制正态分布曲线
Jan 04 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 parse_url 一个好用的函数
2009/10/03 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
初始Nodejs
2014/11/08 NodeJs
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
python 判断是否为正小数和正整数的实例
2017/07/23 Python
python实现图像识别功能
2018/01/29 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
Python如何发布程序的详细教程
2018/10/09 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
计算机专业推荐信范文
2013/11/27 职场文书
广告学毕业生求职信
2014/01/30 职场文书
企业后勤岗位职责
2014/02/28 职场文书
检讨书范文300字
2015/01/28 职场文书
幼儿园开学通知
2015/04/24 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
浅析Python中的套接字编程
2021/06/22 Python
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers