使用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获取目录下所有文件的方法
Jun 01 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
Python3计算三角形的面积代码
Dec 18 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
解决pycharm界面不能显示中文的问题
May 23 Python
python使用百度文字识别功能方法详解
Jul 23 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
python中翻译功能translate模块实现方法
Dec 17 Python
matplotlib更改窗口图标的方法示例
Feb 03 Python
python 中的@运算符使用
May 26 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
一个捕获函数输出的函数
2007/02/14 PHP
PHP下几种删除目录的方法总结
2007/08/19 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
JS实现分页导航效果
2020/02/19 Javascript
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python制作数据导入导出工具
2015/07/31 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
Python文件的读写和异常代码示例
2017/10/31 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
Python 使用type来定义类的实现
2019/11/19 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
python 实现逻辑回归
2020/12/30 Python
副厂长岗位职责
2014/02/02 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
绿色环保标语
2014/06/12 职场文书
上课说话检讨书
2015/01/27 职场文书