惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MyScale Blog
MyScale Blog
T
Tor Project blog
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
MongoDB | Blog
MongoDB | Blog
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
小众软件
小众软件
G
GRAHAM CLULEY
P
Privacy International News Feed
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
E
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
The Register - Security
The Register - Security
S
Securelist
Martin Fowler
Martin Fowler
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
Cisco Talos Blog
Cisco Talos Blog

博客园 - 西北逍遥

实验启动指令 yolov8-pose监测人体关节并保存关节坐标 osg3.6绘制半球体 kinova jaco2 机械臂控制器故障灯闪烁(双绿灯)问题解决方法 IFC标准在学术界的研究与发展历程:从理论探索到产业实践的全面梳理IFC标准在学术界的研究与发展历程:从理论探索到产业实践的全面梳理 BIM的“普通话”:解密IFC标准如何重塑建筑行业 IfcCrewResource Qt重置 Brush 泵仿真 Qt折线的显示与隐藏 Qt绘制折线 c++ Qt绘制传热云图 livox mid-70采集点云数据 随机配色 学习:LED灯闪烁 win10安装neo4j-community-3.5.7-windows win10安装MongoDB 3.0.15 Community python把图片合并成gif图 ubuntu20.04测试cuda start.bat Djstra求解最短路径
pyqt 操作mysql数据库
西北逍遥 · 2026-01-01 · via 博客园 - 西北逍遥

#

import mysql.connector
from datetime import datetime, timezone
from PyQt5.QtCore import pyqtSignal, QObject
import time
import threading

class VC_DB_Tool(QObject):
    signalMsg = pyqtSignal(str)
    
    def __init__(self, host="localhost", port=3306, database="", username="", password=""):
        """
        初始化MySQL工具类
        :param host: 数据库主机地址
        :param port: 数据库端口
        :param database: 数据库名
        :param username: 用户名
        :param password: 密码
        """
        super().__init__()
        self.host = host
        self.port = port
        self.database = database
        self.username = username
        self.password = password
        self.db = None
        self.cursor = None
    #
    def set_DBIP(self,db_ip):
        self.host = db_ip
    #
    def set_DBPort(self,port):
        self.port = port
    #
    #
    def set_DBDatabase(self,database):
        self.database = database
    #
    #
    def set_DBUsername(self,username):
        self.username = username
    #
    def set_DBPassword(self,password):
        self.password = password
    #
    def connect(self):
        """
        连接数据库
        :return: 连接是否成功
        """
        try:
            self.db = mysql.connector.connect(
                host=self.host,
                port=self.port,
                database=self.database,
                user=self.username,
                password=self.password
            )
            self.cursor = self.db.cursor(dictionary=True)
            self.signalMsg.emit("数据库连接成功")
            return True
        except Exception as e:
            self.signalMsg.emit(f"数据库连接失败: {str(e)}")
            return False

    def disconnect(self):
        """
        断开数据库连接
        """
        if self.db and self.db.is_connected():
            self.cursor.close()
            self.db.close()
            self.signalMsg.emit("数据库连接已断开")

    def read_table_data(self, table_name):
        """
        读取数据表所有数据
        :param table_name: 表名
        :return: 查询结果列表
        """
        if not self.db or not self.db.is_connected():
            self.signalMsg.emit("数据库未连接")
            return None

        try:
            query = f"SELECT * FROM {table_name}"
            self.cursor.execute(query)
            result = self.cursor.fetchall()
            return result
        except Exception as e:
            self.signalMsg.emit(f"读取表数据失败: {str(e)}")
            return None

    def query_data(self, table_name, conditions=None):
        """
        根据条件查询数据表数据
        :param table_name: 表名
        :param conditions: 查询条件字典,如 {"name": "张三", "age": 25}
        :return: 查询结果列表
        """
        if not self.db or not self.db.is_connected():
            self.signalMsg.emit("数据库未连接")
            return None

        try:
            # 构建SQL语句   
            sql = f"SELECT * FROM {table_name}"
            if conditions:
                where_clause = " AND ".join([f"{key}={conditions[key]}" for key in conditions.keys()])
                sql += f" WHERE {where_clause};"
            self.signalMsg.emit(f"{str(sql)}")
            self.cursor.execute(sql, conditions or {})
            result = self.cursor.fetchall()
            return result
        except Exception as e:
            self.signalMsg.emit(f"条件查询失败: {str(e)}")
            return None

    def get_table_count(self, database_name):
        """
        获取某个数据库的数据表数量
        :param database_name: 数据库名
        :return: 数据表数量
        """
        if not self.db or not self.db.is_connected():
            self.signalMsg.emit("数据库未连接")
            return None

        try:
            query = """
            SELECT COUNT(*) as table_count 
            FROM information_schema.tables 
            WHERE table_schema = %s
            """
            self.cursor.execute(query, (database_name,))
            result = self.cursor.fetchone()
            return result['table_count'] if result else None
        except Exception as e:
            self.signalMsg.emit(f"获取表数量失败: {str(e)}")
            return None

    def check_table_exists(self, table_name):
        """
        检查表是否存在
        :param table_name: 表名
        :return: 是否存在
        """
        if not self.db or not self.db.is_connected():
            self.signalMsg.emit("数据库未连接")
            return False

        try:
            self.cursor.execute("SHOW TABLES LIKE %s", (table_name,))
            return self.cursor.fetchone() is not None
        except Exception as e:
            self.signalMsg.emit(f"检查表存在失败: {str(e)}")
            return False
    #
    def extract_date_from_table_name(self,table_name):
        """从表名中提取日期字符串"""
        parts = table_name.split('_')
        if len(parts) >= 4:
            return parts[-1]
        return ""

    def sort_table_names_by_date(self,table_names):
        """根据表名中的日期部分对表名进行排序(从最远到最近)"""
        sorted_tables = sorted(table_names, key=self.extract_date_from_table_name, reverse=False)
        return sorted_tables

    #
    def get_all_table_names(self, database_name=None):
        """
        获取数据库中所有表的名称
        :param database_name: 数据库名,如果为None则使用当前连接的数据库
        :return: 表名列表
        """
        if not self.db or not self.db.is_connected():
            self.signalMsg.emit("数据库未连接")
            return None

        try:
            if database_name is None:
                database_name = self.database
            
            query = """
            SELECT table_name 
            FROM information_schema.tables 
            WHERE table_schema = %s
            ORDER BY table_name
            """
            self.cursor.execute(query, (database_name,))
            result = self.cursor.fetchall()
            #
            #print(result)
            # 提取表名列表
            table_names = [row['TABLE_NAME'] for row in result]
            # 按日期排序
            sorted_tables = self.sort_table_names_by_date(table_names)
            return sorted_tables
        except Exception as e:
            self.signalMsg.emit(f"获取表名列表失败: {str(e)}")
            return None
    #
#

#