使用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使用fcntl模块实现程序加锁功能示例
Jun 23 Python
通过Python实现自动填写调查问卷
Sep 06 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
pandas数据集的端到端处理
Feb 18 Python
python 搜索大文件的实例代码
Jul 08 Python
Django REST framework内置路由用法
Jul 26 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
Python如何发送与接收大型数组
Aug 07 Python
如何用 Python 制作一个迷宫游戏
Feb 25 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 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
搜索引擎技术核心揭密
2006/10/09 PHP
基于mysql的bbs设计(四)
2006/10/09 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
python中实现指定时间调用函数示例代码
2017/09/08 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
使用python去除图片白色像素的实例
2019/12/12 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
英文翻译的自我评价语句
2013/10/04 职场文书
高三政治教学反思
2014/02/06 职场文书
拉拉队口号
2014/06/16 职场文书
聘用意向书
2014/07/29 职场文书
社会工作专业自荐信
2014/09/26 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
SQLServer中exists和except用法介绍
2021/12/04 SQL Server
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python