使用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的自动化部署模块Fabric的安装及使用指南
Jan 19 Python
python实现逻辑回归的方法示例
May 02 Python
Python使用三种方法实现PCA算法
Dec 12 Python
python版微信跳一跳游戏辅助
Jan 11 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
Django接收自定义http header过程详解
Aug 23 Python
Python全栈之列表数据类型详解
Oct 01 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
Python中的datetime包与time包包和模块详情
Feb 28 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
php轻松实现中英文混排字符串截取
2014/05/28 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
2018/08/10 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
微信小程序自定义组件
2017/08/16 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
python实现图片中文字分割效果
2019/07/22 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
Django分页功能的实现代码详解
2019/07/29 Python
python sorted函数的小练习及解答
2019/09/18 Python
python Tensor和Array对比分析
2020/01/08 Python
python实现FTP循环上传文件
2020/03/20 Python
python中tab键是什么意思
2020/06/18 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
python之随机数函数的实现示例
2020/12/30 Python
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
生物制药自我鉴定
2014/01/25 职场文书
园林技术个人的自我评价
2014/02/15 职场文书
垃圾桶标语
2014/06/24 职场文书
博士生导师推荐信
2014/07/08 职场文书
项目投资合作意向书
2014/07/29 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
回复函范文
2015/07/14 职场文书
思品教学工作总结
2015/08/10 职场文书