基于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实现挑选出来100以内的质数
Mar 24 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
python中单下划线_的常见用法总结
Jul 10 Python
python使用Matplotlib画饼图
Sep 25 Python
基于Python实现用户管理系统
Feb 26 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
在pycharm中显示python画的图方法
Aug 31 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
Mar 06 Python
python实现程序重启和系统重启方式
Apr 16 Python
keras输出预测值和真实值方式
Jun 27 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 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
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
Python实现的桶排序算法示例
2017/11/29 Python
python实现kNN算法
2017/12/20 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
django框架中间件原理与用法详解
2019/12/10 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
汽车专业毕业生自荐信
2013/11/03 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
政协调研汇报材料
2014/08/15 职场文书
解决Oracle数据库用户密码过期
2022/05/11 Oracle
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers