使用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线程锁(thread)学习示例
Dec 04 Python
python之wxPython菜单使用详解
Sep 28 Python
跟老齐学Python之编写类之二方法
Oct 11 Python
windows下ipython的安装与使用详解
Oct 20 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
利用python开发app实战的方法
Jul 09 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
python进行参数传递的方法
May 12 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
python uuid生成唯一id或str的最简单案例
Jan 13 Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 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多用户读写文件冲突的解决办法
2013/11/06 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
Python MySQLdb Linux下安装笔记
2015/05/09 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
XML文档面试题
2015/08/05 面试题
自主招生自荐信
2013/12/08 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS