使用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之字典,你还记得吗?
Sep 20 Python
python自定义类并使用的方法
May 07 Python
Python2.x版本中maketrans()方法的使用介绍
May 19 Python
查看django版本的方法分享
May 14 Python
python3实现爬取淘宝美食代码分享
Sep 23 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
Python创建空列表的字典2种方法详解
Feb 13 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
Python用5行代码实现批量抠图的示例代码
Apr 14 Python
最新pycharm安装教程
Nov 18 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引用返回与取消引用的详解
2013/06/08 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
python编程实现归并排序
2017/04/14 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
Django中间件实现拦截器的方法
2018/06/01 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
Python自动创建Excel并获取内容
2020/09/16 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
受欢迎的大学生自我评价
2013/12/05 职场文书
护士实习鉴定范文
2013/12/22 职场文书
小学教师师德反思
2014/02/03 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
求职自我推荐信
2014/06/25 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
入党自荐书范文
2015/03/05 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android