SQLAlchemy 封装的工具类,数据库pgsql(数据库连接池)

news2024/9/20 8:05:45

1.SQLAlchemy是什么?

          SQLAlchemy 是 Python 著名的 ORM 工具包。通过 ORM,开发者可以用面向对象的方式来操作数据库,不再需要编写 SQL 语句。

SQLAlchemy 支持多种数据库,除 sqlite 外,其它数据库需要安装第三方驱动。

2. 使用数据库连接池说明


    Engine 对象是使用 sqlalchemy 的起点,Engine 包括数据库连接池 (Pool) 和 方言 (Dialect,指不同数据库 sql 语句等的语法差异),两者一起把对数据库的操作,以符合 DBAPI 规范的方式与数据库交互。

3.工具类展示

  3.1 数据库配置类:db_config.py

# dev环境配置
host = "dev-pg.test.xxxx.cloud"
port = 1921
user = "check"
database = "checkn"
password = "Ku2221AP123aXsNW"
# 连接池大小,默认为5,设置为0时表示连接无限制
pool_size = 10
# 连接池中最大连接数,如果访问数据库的请求数超过了pool_size,连接池将会自动创建新的连接,
# 直到创建达到max_overflow个连接为止。默认情况下,max_overflow值为10
max_overflow = 20
# 连接池中获取连接的等待时间,超过该等待时间后,获取连接方法将会超时,引发连接失败异常。默认情况下,timeout为30秒。
pool_timeout = 60

3.2 数据库类封装:database.py

# !/usr/bin/python
# -*- coding: UTF-8 -*-

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base

import db_config


class dbTools(object):
    session = None;
    isClosed = True;

    def open(self, host=db_config.host, port=db_config.port, db=db_config.database, user=db_config.user,
             pwd=db_config.password, pool_size=db_config.pool_size, max_overflow=db_config.max_overflow,
             pool_timeout=db_config.pool_timeout):
        url = 'postgresql://%s:%s@%s:%d/%s' % (user, pwd, host, port, db)
        # echo: 设置为ture时,会将orm语句转化成sql语句并打印出来,一般debug时候使用
        engine = create_engine(url, poolclass=QueuePool, pool_size=pool_size, max_overflow=max_overflow,
                               pool_timeout=pool_timeout, echo=True)
        DbSession = sessionmaker(bind=engine)

        self.session = DbSession()
        self.isClosed = False
        return self.session

    def query(self, type):
        query = self.session.query(type)
        return query

    def execute(self, sql):
        return self.session.execute(sql)

    def add(self, item):
        self.session.add(item)

    def add_all(self, items):
        self.session.add_all(items)

    def delete(self, item):
        self.session.delete(item)

    def commit(self):
        self.session.commit()

    def close(self):
        if self.isClosed:
            pass
        self.session.close()
        self.isClosed = True

3.3 模型类 modeBatchInfo.py

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import String, Column, Integer, DateTime, Enum, Table, ForeignKey, Text
from sqlalchemy.orm import relationship

# 创建Base类
Base = declarative_base()


# 创建ORM模型类
class icsBatchInfo(Base):
    __tablename__ = 'ics_batch_info'
    batch_id = Column(Integer, primary_key=True)
    process_id = Column(String)
    task_id = Column(String)
    data_path = Column(Text)
    project_id = Column(String)
    user_name = Column(String)
    user_type = Column(String)
    status = Column(String)
    start_time = Column(DateTime)
    end_time = Column(DateTime)
    confidence_code = Column(String)
    repair_code = Column(String)
    report_count = Column(Integer)
    task_scope = Column(Text)
    adcity_code = Column(String)
    progress = Column(String)
    task_type = Column(String)
    job_id = Column(String)

3.4 开始使用工具类:main.py

# coding=utf-8
from database import dbTools
from modelBatchInfo import icsBatchInfo
from sqlalchemy import text

if __name__ == "__main__":
    dbtools = dbTools()
    dbtools.open()
    # 打开一个文件
    with open('task.txt') as fr:
        # 读取文件所有行
        lines = fr.readlines()
    lines = [i.rstrip() for i in lines]
    list = []
    list.append("taskId,batchId\n")
    for taskId in lines:
        # 1. 使用对象查询
        # result = dbtools.query(icsBatchInfo).filter(icsBatchInfo.task_id == taskId).all()
        # nodes = dbtools.filter(icsBatchInfo.py.master == False).all()
        # 2. 使用sql查询
        sql = text(
            "select *  from ics_batch_info where batch_id=(select MAX(batch_id) from ics_batch_info WHERE task_id = '{taskId}')".format(
                taskId=taskId))
        result = dbtools.execute(sql)
        for batchInfo in result:
            list.append(batchInfo.task_id + "," + str(batchInfo.batch_id) + "\n")

    dbtools.close()

    list[len(list) - 1] = list[len(list) - 1].rstrip();
    with open("最大批次查询结果.csv", 'w') as fw:
        fw.writelines(list)

    print("☺☺☺执行完毕☺☺☺")

说明:

读取本目录下task.txt 中的任务号,去查数据库记录,并将需求查出来的内容写到本地csv文件"最大批次查询结果.csv" 文件。

上阶尽管费力,却一步比一步高。不经过琢磨,宝石也不会发光

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/960139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航

8月25日,第二十六届成都国际汽车展览会在中国西部国际博览城隆重开幕。车展举办期间,远航汽车董事长远勤山先生、产品研发总监王震先生向媒体分享了远航汽车品牌发展、产品研发、技术创新以及市场布局等内容。 “通过我们的付出和努力,让我们…

景芯SoC 芯片全流程培训

【全网唯一】景芯SoC是一款用于芯片全流程培训的低功耗ISP图像处理SoC,采用低功耗RISC-V处理器,内置ITCM SRAM、DTCM SRAM,集成包括MIPI、ISP、CNN、QSPI、UART、I2C、GPIO、百兆以太网等IP,采用SMIC40工艺设计流片。 培训数据包括…

云计算在智能制造中的应用与前景

文章目录 云计算的基本概念智能制造的基本概念云计算在智能制造中的应用1. 数据存储和管理2. 大数据分析3. 机器学习和预测维护4. 跨地理分布的协作5. 资源弹性和成本优化 未来前景1. 智能工厂2. 预测性维护3. 定制化生产4. 绿色生产5. 全球制造协作 结论 🎉欢迎来到…

QTday3(QT实现文件对话框保存操作、实现键盘触发事件【WASD控制小球的移动】)

1.实现文件对话框保存操作 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_fontBtn_clicked() {//调用QFo…

Java的23种设计模式

Java的23种设计模式 一、创建型设计模式1.单例模式 singleton1.1.静态属性单例模式1.2 静态属性变种1.3 基础的懒汉模式1.4 线程安全的懒加载单例1.5 线程安全的懒加载 单例-改进1.6 双重检查锁1.7 静态内部类1.8 枚举单例1.9 注册表单例 2.工厂方法模式 factory3.抽象工厂模式…

Error:Java:无效的源发行版:14

问题描述:项目拉下来,跑的时候发现版本有问题。这个问题可好解决了,只需要看下面几个方面,然后让他们保持一致就OK了 step1:查看本地的jdk版本 打开cmd窗口,输入命令 java -version就可以查看到本地的jdk版…

dji uav建图导航系列(三)模拟建图、导航

前面博文【dji uav建图导航系列()建图】、【dji uav建图导航系列()导航】 使用真实无人机和挂载的激光雷达完成建图、导航的任务。 当需要验证某一个slam算法时,我们通常使用模拟环境进行测试,这里使用stageros进行模拟测试,实际就是通过模拟器,虚拟一个带有传感器(如…

如何一键批量查询全部物流信息?

在日常工作中,快递物流信息的查询是一项常规任务。然而,这个过程往往既耗时又费力,尤其是在面对大量单号的情况下。为了解决这个问题,我们推荐使用固乔快递查询助手,一款能够快速、准确地查询快递物流信息的软件。 首先…

【线程池】如何判断线程池中的任务执行完毕(三)

目录 前言 1. isTerminated()方法 2. awaitTermination()方法 3.getTaskCount()方法和executor.getCompletedTaskCount()方法结合使用 4.使用CountDownlatch类 前言 通常我们使用线程池的时候,系统处于运行的状态,而线程池本身就是主要为了线程复用&…

CVE-2023-23752:Joomla未授权访问漏洞复现

CVE-2023-23752:Joomla未授权访问漏洞复现 前言 本次测试仅供学习使用,如若非法他用,与本文作者无关,需自行负责!!! 一.Openfire简介 Joomla是一个免费的开源内容管理系统(CMS&a…

Java for循环每次都通过list.size()和 string.length()获取大小性能

有人说在for循环之前用一个局部变量先获取到list.size()、str.length(),然后在for循环的判断条件里通过这个局部变量替换list.size()、str.length()会节省数据计算的时间。事实真的是这样吗?下面就为大家解答这个问题。 说明:此文章针对Andro…

打造成功的砍价营销大解析,销量飙升

砍价活动是吸引顾客的一种有效方式,可以帮助提高销量和提升品牌知名度。在乔拓云平台上,我们提供了一套简单易用的工具,让您能够轻松地制作一个成功的砍价活动。下面,我将详细介绍具体步骤,让您能够轻松上手。 第一步&…

港联证券|4%!央行宣布:降准!新股大涨138%,再现触发临停!

煤炭领涨两市,多股有望继续高份额分红。 沪指早间冲高后有所回落,上证50盘中一度涨超1%,保险、银行等大金融板块拉升。食品、乳业、白酒、零售等大消费板块全线拉升,半导体芯片股走低,泰凌微跌超10%,寒武纪…

8个神奇的UI设计工具,小白也可轻松上手

随着设计工作的不断发展,市面上好用的设计工具也丰富起来,今天本文共整理了8个好用的设计工具,可以充分满足设计师对设计工具使用的需求,接下来就一起来看看吧! 1、即时设计 即时设计是一个面向个人设计师和中小型设…

考前冲刺上岸浙工商MBA的备考经验分享

2023年对于许多人来说都是不平凡的一年,历经三年的抗争,我们终于成功结束了疫情。而我也很幸运的被浙工商MBA项目录取,即将开始全新的学习生活。身为一名已在职工作6年的人,能够重回校园真是一种特别令人激动的体验。今天&#xf…

极致内卷的中国电商路在何方?

2023年上半年最大的价值在于终于找到了确定性:1,消费仍然在增长是确定的,只是增速不再那么高;2,必须从“流量”转向做“留量”是确定的,无论是互联网还是传统消费领域,所有企业都在强调做单客运…

游戏发行商能够提供什么服务?

游戏发行商可以为游戏开发者提供广泛的服务,以帮助他们将游戏成功地引入市场并取得更好的业绩。以下是游戏发行商可能提供的一些服务: 市场营销和宣传:发行商通常具有丰富的市场营销经验,可以制定并执行有效的宣传和营销策略。他们…

硬盘数据恢复- 硬盘中文件打开报错的数据恢复案例

硬盘数据恢复环境&故障情况: 某单位重要数据在一台WINDOWS操作系统的PC机上通过网络共享给公司员工使用。这台PC同时也连接着打印机提供打印服务,很多员工直接将文件拷贝到这台PC上进行打印。该PC机上只有一块500G磁盘。 该PC的F盘分区所有类型文件突…

Effetive STL | 条款2 : 小心对“容器无关代码”的幻想

Effetive STL | 条款2 : 小心对“容器无关代码”的幻想 文章目录 Effetive STL | 条款2 : 小心对“容器无关代码”的幻想STL 容器特点推行自己的容器容器能力的交集 封装Method1: typedefMethod2: class>>>>> 欢迎关注公众号【三戒纪元】…

大数据学习:kafka-producer源码分析

kafka-producer源码分析 kafka-1.0.1源码下载地址 一.kafka发送示例 /*** Created by XiChuan on 2021/6/7.*/ public class ProducerTest {public static void main(String[] args) throws Exception {KafkaProducer<String, String> producer createProducer();JSO…