使用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 21 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
python函数形参用法实例分析
Aug 04 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
FFrpc python客户端lib使用解析
Aug 24 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
python判断正负数方式
Jun 03 Python
通过代码简单了解django model序列化作用
Nov 12 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 Python
python用opencv 图像傅里叶变换
Jan 04 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
当海贼王变成JOJO风
2020/03/02 日漫
PHP生成静态页
2006/11/25 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
php字符串操作针对负值的判断分析
2016/07/28 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
php弹出提示框的是实例写法
2019/09/26 PHP
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
再谈JavaScript线程
2015/07/10 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
Python fileinput模块使用介绍
2014/11/30 Python
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
关于Python数据结构中字典的心得
2017/12/04 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
培训主管岗位职责
2014/02/01 职场文书
小学运动会入场式解说词
2014/02/18 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
维稳承诺书
2015/01/20 职场文书
Go timer如何调度
2021/06/09 Golang
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js
python的html标准库
2022/04/29 Python