使用SQLAlchemy操作数据库表过程解析
作者:路痴队长 时间:2024-01-20 14:42:59
需求场景:
使用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
标签:SQL,Alchemy,操作,数据库,表
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
宽屏不是用来阅读的
2009-04-05 15:59:00
在Mac上删除自己安装的Python方法
2021-03-22 22:10:57
OverFlow – 一个秘密武器
2010-09-25 12:51:00
![](https://img.aspxhome.com/file/UploadPic/20109/25/rss1-42s.png)
解析Python中的eval()、exec()及其相关函数
2023-12-16 02:51:59
CentOS7.5 安装MySql的教程
2024-01-13 07:08:16
![](https://img.aspxhome.com/file/2023/4/72514_0s.png)
MySQL 数据库的监控方式小结
2024-01-14 19:07:14
![](https://img.aspxhome.com/file/2023/2/76452_0s.jpg)
教你解决往mysql数据库中存入汉字报错的方法
2024-01-15 02:32:06
![](https://img.aspxhome.com/file/2023/7/106587_0s.png)
SOSO地图API使用(一)在地图上画圆实现思路与代码
2024-04-10 13:54:07
![](https://img.aspxhome.com/file/2023/8/136948_0s.png)
对django views中 request, response的常用操作详解
2021-02-21 15:00:51
如何在Django项目中引入静态文件
2021-10-09 11:24:52
![](https://img.aspxhome.com/file/2023/1/71491_0s.png)
简单易懂Pytorch实战实例VGG深度网络
2021-09-07 19:47:24
python 中的9个实用技巧,助你提高开发效率
2021-05-01 08:26:25
透明数据加密(TDE)库的备份和还原
2024-01-14 04:51:57
![](https://img.aspxhome.com/file/2023/7/94427_0s.png)
SQL Server数据库实用小技巧集合
2008-11-25 11:35:00
javascript中css的float特殊写法
2007-12-24 20:24:00
python学习教程之Numpy和Pandas的使用
2022-12-14 12:41:06
![](https://img.aspxhome.com/file/2023/1/120281_0s.jpg)
Python中实现变量赋值传递时的引用和拷贝方法
2021-12-26 04:05:54
pytorch-神经网络拟合曲线实例
2022-03-17 18:17:30
![](https://img.aspxhome.com/file/2023/5/66815_0s.jpg)
python实现简单的飞机大战
2023-07-08 09:16:10
![](https://img.aspxhome.com/file/2023/0/81580_0s.jpg)
python之js逆向功能演示详解
2023-09-01 13:49:29