使用SQLAlchemy操作数据库表过程解析
作者:路痴队长 发布时间:2024-01-20 14:42:59
标签:SQL,Alchemy,操作,数据库,表
需求场景:
使用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()
来源:https://www.cnblogs.com/We612/p/12357769.html


猜你喜欢
- 前言图像分割是指根据灰度、色彩、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域。最简单的图像分割就是将物体从背景中分割出来1.图像
- 函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念。装饰器的基本概念装饰器是一个可调用对象,它的参数是另一个
- 本质是一个普通的js对象,用于描述视图界面结构的,在mouted的回调中,可以输出_vnode, 通过图可以知道,_vnode中有
- win7 +Navicat Lite 9+ VMware7在VMware中安装openSUSE11.x mysql5 Navicat Lit
- myisam_max_[extra]_sort_file_size足够大delay_key_write减少io,提高写入性能bulk_ins
- 这是我的第一个真正意思上的自动化脚本。1、练习的测试用例为:打开百度首页,搜索“胡歌”,然后检索列表,有无“胡歌的新浪微博”这个链接 2、在
- 如何在SQL2000的查询中使用XML-Data?具体程序如下:orders.asp<%@ Language=VBScrip
- 本文主要介绍的是MySQL慢查询分析方法,前一段日子,我曾经设置了一次记录在MySQL数据库中对慢于1秒钟的SQL语句进行查询。想起来有几个
- 背景在一次进行SQl查询时,我试着对where条件中vachar类型的字段去掉单引号查询,这个时候发现这条本应该很快的语句竟然很慢。这个va
- 本文实例讲述了Python使用sorted排序的方法。分享给大家供大家参考,具体如下:# 例1. 按照元素出现的次数来排序seq = [2,
- 本文实例讲述了python实现中文输出的两种方法。分享给大家供大家参考。具体如下:方法一:用encode和decode如:import os
- 也许光从字面上来说,版式设计中的“亲密性”似乎不太好理解,正常的情况下,我们都会把“亲密性”理解为人与人之间的关系的一种表现,事实上在版式设
- 目标:创建一个字典,记录几对python词语,使用OrderedDict类来写,并按顺序输出。写完报错:[root@centos7 tmp]
- 记录应用程序的操作日志可以使用数据库、文本文件、XML文件等。我这里介绍的是使用 XML 文件记录操作日志。我觉得使用 XML 记录操作日志
- 使用运算符“+”PHP的数组运算符“+”可以用来联合两个(或
- 一、日志级别1. 级别定义logging模块提供了5种日志级别,分别为:CRITICAL>ERROR>WARNING>IN
- 前言在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困
- --程序员们在编写一个雇员报表,他们需要得到每个雇员当前及历史工资状态的信息, --以便生成报表。报表需要显示每个人的晋升日期和工资数目。
- onchange在用于文本框输入框时,有一个明显的不足. 事件不会随着文字的输入而触发,而是等到文本框失去焦点(onblur)时才会触发.
- 今天给大家推荐一款在输出中对敏感数据进行脱敏的工作包:go-mask。那么,什么是对敏感数据脱敏呢?就是将敏感信息输出的时候替换成星号或其他