使用SQLAlchemy操作数据库表过程解析


Posted in Python onJune 10, 2020

需求场景:

使用sqlalchmy从现有的表中获取数据(不是自己建表)。百度了一下,网上都是使用sqlalchemy自己先创建表,然后导入数据表的模型类进行增删改查;现在不是自己建表,该如何操作呢?

操作方案

通过sqlalchmey执行原生的sql语句,增删改查的原生语句携带表名,就不需要导入数据表的模型类了。

使用的包:

SQLAlchemy (1.3.10) + mysql-connector-python (8.0.19)

提供以下干货:

  • 演示了向原生sql语句传递变量的用法 即动态执行sql语句 更加灵活
  • 通过执行原生的sql语句实现操作已有的表
  • 演示了sql语句根据多字段排序的方法等

DEMO

# -*- coding:utf-8 -*-
from sqlalchemy import create_engine,MetaData,Table,exists
from sqlalchemy.orm import sessionmaker, scoped_session
from util.Log import Log
from conf.parseConfig import parseConf
# 从配置文件中获取mysql的配置信息
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)


class OpsMysql(object):
  def __init__(self, log=Log(__file__).getlog()):
    self.log = log
    self.session = None
    try:
      self.engine = create_engine(
        engine_str,
        max_overflow=0, # 超过连接池大小外最多创建的连接
        pool_size=5, # 连接池大小
        pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1, # 多久之后对线程池中的线程进行一次连接的回收(重置)
        # echo=True, # 显示相应执行的 sql 指令
        encoding='utf-8'
      )
      SessionFactory = sessionmaker(bind=self.engine)
      self.session = scoped_session(SessionFactory)
    except Exception as e:
      self.log.error(str(e))
      self.log.error("Connect {0}@{1}:{2} failed!".format(dbname, host, port))

  def get_session(self):
    return self.session

  def getEngine(self):
    return self.engine

  def init_db(self, base):
    base.metadata.create_all(self.engine)

  def drop_db(self, base):
    base.metadata.drop_all(self.engine)


if __name__ == "__main__":
  log = Log(__file__).getlog()
  tt = OpsMysql(log)
  session = tt.get_session()
  
  if session:
    # 通过执行原生的sql语句实现操作已有的表
    # 此处演示了向原生sql语句传递变量的用法 即动态执行sql语句 更加灵活
    mail_id = 1
    res = session.execute('select * from tbl_mail_addr where mail_id='" + mail_id + "' and mail_tp="c"')
    res01 = res.fetchall() # 结果是列表
    print(res01[0])
    # (1, 'c', 1, 'XX@u163.com')
    
    mail_id = '1'
    mail_type = 'c'
    # 查询id为1,类型是c的邮箱信息,并按mail_tp降序,addr_no升序排列,限制查询数量100
    sql = "select * from tbl_mail_addr where tbl_mail_addr.oper_flag='1' and tbl_mail_addr.mail_id='" + mail_id + "' and tbl_mail_addr.mail_tp='" + mail_type + "' order by tbl_mail_addr.mail_tp, tbl_mail_addr.addr_no ASC limit 100"
    result = session.execute(sql)
    value_list = result.fetchall()
    print(value_list)
    # [(1, 'c', 1, 'XX@163.com'), (1, 'c', 2, 'XX@qq.com), (1, 'c', 3, 'XX@qq.com')]

  session.close()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python绘图方法实例入门
May 19 Python
python 网络编程常用代码段
Aug 28 Python
轻松理解Python 中的 descriptor
Sep 15 Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 Python
python读出当前时间精度到秒的代码
Jul 05 Python
python中的反斜杠问题深入讲解
Aug 12 Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
python实现udp传输图片功能
Mar 20 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 Python
实例讲解Python中sys.argv[]的用法
Jun 03 Python
keras 多gpu并行运行案例
Jun 10 #Python
Keras自定义IOU方式
Jun 10 #Python
Python实现在线批量美颜功能过程解析
Jun 10 #Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 #Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 #Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 #Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 #Python
You might like
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
javascript中关于执行环境的杂谈
2011/08/14 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
关于Django外键赋值问题详解
2017/08/13 Python
对python3 urllib包与http包的使用详解
2018/05/10 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
电子商务网站的创业计划书
2014/01/05 职场文书
会计顶岗实习心得
2014/01/25 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
质检员岗位职责
2015/02/03 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
关于HTML编码导致的乱码问题
2021/09/04 HTML / CSS
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
VUE递归树形实现多级列表
2022/07/15 Vue.js