使用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在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python2.7的编码问题与解决方法
Oct 04 Python
python 中split 和 strip的实例详解
Jul 12 Python
浅谈python之新式类
Aug 12 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
Python学习之os模块及用法
Jun 03 Python
Python基于network模块制作电影人物关系图
Jun 19 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
pytorch中的numel函数用法说明
May 13 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
js中url对象化管理分析
2017/12/29 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
vue实现拖拽效果
2019/12/23 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
跟老齐学Python之集合(set)
2014/09/24 Python
python3操作mysql数据库的方法
2017/06/23 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
Python for循环与range函数的使用详解
2019/03/23 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
服装机修工岗位职责
2013/12/26 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
工程开工庆典邀请函
2014/02/01 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
表扬通报怎么写
2015/01/16 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js