基于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中使用PyHook监听鼠标和键盘事件实例
Jul 18 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
使用Python的urllib2模块处理url和图片的技巧两则
Feb 18 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
python 实现识别图片上的数字
Jul 30 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
python框架django项目部署相关知识详解
Nov 04 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 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使用百度翻译api示例分享
2014/01/31 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python实现全盘扫描搜索功能的方法
2019/02/14 Python
python pytest进阶之fixture详解
2019/06/27 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
python能开发游戏吗
2020/06/11 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
幼儿园老师辞职信
2014/01/20 职场文书
药剂专业自荐书
2014/06/20 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
微观世界观后感
2015/06/10 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
四年级数学教学反思
2016/02/16 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
golang语言指针操作
2022/04/14 Golang
python实现商品进销存管理系统
2022/05/30 Python