使用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基础教程之python消息摘要算法使用示例
Feb 10 Python
跟老齐学Python之大话题小函数(1)
Oct 10 Python
python列表操作实例
Jan 14 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
OpenCV读取与写入图片的实现
Oct 13 Python
pytest进阶教程之fixture函数详解
Mar 29 Python
Python制作春联的示例代码
Jan 22 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注释实例技巧
2008/10/03 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
Django查询数据库的性能优化示例代码
2017/09/24 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
八年级美术教学反思
2014/02/02 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
气象学专业个人求职信
2014/04/22 职场文书
学雷锋宣传标语
2014/06/25 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
详解PyTorch模型保存与加载
2022/04/28 Python