使用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爬取网站数据保存使用的方法
Nov 20 Python
python使用Berkeley DB数据库实例
Sep 26 Python
Python的动态重新封装的教程
Apr 11 Python
python动态参数用法实例分析
May 25 Python
浅谈function(函数)中的动态参数
Apr 30 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
Python基于OpenCV实现人脸检测并保存
Jul 23 Python
PyTorch中permute的用法详解
Dec 30 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 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各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
vue实现图片上传预览功能
2019/12/23 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python3使用urllib模块制作网络爬虫
2016/04/08 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
工业自动化毕业生自荐信范文
2014/01/04 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
保护环境倡议书100字
2014/05/19 职场文书
2015年领班工作总结
2015/04/29 职场文书
施工安全保证书
2015/05/09 职场文书
公积金具结保证书
2015/05/11 职场文书
行政处罚告知书
2015/07/01 职场文书
如何写通讯稿
2015/07/22 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
PL350与SW11的比较
2021/04/22 无线电
如何用Navicat操作MySQL
2021/05/12 MySQL
Python基础之数据类型知识汇总
2021/05/18 Python
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android