【AI总结】python连接MySQL(5)- 高级数据库配置与连接器设计

连接器与MCP是什么关系?从数据库到设计稿转APP的实战指南 在AI Agent与低代码平台快速发展的今天,连接器作为打通外部系统和智能工作流的关键组件,正被越来越多开发者关注。连接器本质上是将数据库、API、设计稿平台等外部能力封装成AI可调用的标准单元,而MCP(模型上下文协议)则为这种封装提供了一套统一的通信规范,就像AI领域的USB-C接口,让模型能通过标准化的工具调用获取数据、执行操作。理解连接器与MCP的关系,是搭建高效Agent工作流的基础。实际工程中,通过MCP Server连接数据库,可让AI按自然语言指令完成订单统计、数据查询等任务;接入设计稿平台 阅读详情

高级数据库配置与连接器设计

摘要:本文将展示一个基于继承的数据库配置架构,通过基础配置类和专用连接器实现多数据库的统一管理,解决配置复用和命名一致性问题。


一、优化后的配置架构设计

目录结构

project_root/
├── configs/  
│   ├── base_config.py      # 基础配置类  
│   ├── mysql_config.py     # MySQL专用配置  
│   ├── mongo_config.py     # MongoDB专用配置  
│   ├── redis_config.py     # Redis专用配置  
│   └── duckdb_config.py    # DuckDB专用配置  
├── connectors/  
│   ├── base_connector.py   # 连接器基类  
│   ├── mysql_connector.py  # MySQL连接器  
│   ├── mongo_connector.py  # MongoDB连接器  
│   ├── redis_connector.py  # Redis连接器  
│   └── duckdb_connector.py # DuckDB连接器  
└── services/  
    └── ...                 # 业务服务  

二、基础配置与连接器设计

1. 基础配置类

# configs/base_config.py
class BaseDBConfig:
    """数据库基础配置"""
    
    def __init__(self):
        # 通用连接参数
        self.timeout = 10  # 秒
        self.max_retries = 3
        self.auto_reconnect = True
        
        # 连接池参数
        self.pool_enabled = True
        self.pool_size = 5
        self.pool_timeout = 30  # 秒
        
        # 监控参数
        self.monitor_enabled = True
        self.monitor_interval = 60  # 秒
        
    def get_connection_params(self) -> dict:
        """获取连接参数(子类必须实现)"""
        raise NotImplementedError("子类必须实现此方法")

2. 基础连接器类

# connectors/base_connector.py
from abc import ABC, abstractmethod
import logging
from configs.base_config import BaseDBConfig

logger = logging.getLogger(__name__)

class BaseDBConnector(ABC):
    """数据库连接器基类"""
    
    def __init__(self, config: BaseDBConfig):
        """
        初始化连接器
        :param config: 数据库配置实例
        """
        self.config = config
        self._connection = None
        self._connections = {}  # 多实例连接缓存
        logger.info(f"初始化 {self.__class__.__name__} 连接器")
        
    @abstractmethod
    def connect(self, config_name: str = "default"):
        """建立数据库连接(子类实现)"""
        pass
        
    @abstractmethod
    def close(self, config_name: str = "default"):
        """关闭数据库连接(子类实现)"""
        pass
        
    @abstractmethod
    def execute_query(self, query: str, params=None, config_name: str = "default"):
        """执行查询操作(子类实现)"""
        pass
        
    @abstractmethod
    def execute_command(self, command: str, params=None, config_name: str = "default"):
        """执行写操作(子类实现)"""
        pass
        
    def health_check(self, config_name: str = "default") -> bool:
        """健康检查(默认实现,子类可覆盖)"""
        try:
            self.connect(config_name)
            return True
        except Exception as e:
            logger.error(f"数据库健康检查失败: {e}")
            return False
        finally:
            self.close(config_name)
            
    def __enter__(self):
        """上下文管理器支持"""
        self.connect()
        return self
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        """退出时自动关闭连接"""
        self.close()

三、MySQL专用配置与连接器

1. MySQL配置类

# configs/mysql_config.py
from configs.base_config import BaseDBConfig

class MySQLConfig(BaseDBConfig):
    """MySQL数据库专用配置"""
    
    def __init__(self):
        super().__init__()
        # MySQL特有参数
        self.charset = "utf8mb4"
        self.autocommit = False
        self.client_flag = 0
        self.ssl_disabled = False
        
    def get_connection_params(self) -> dict:
        """获取MySQL连接参数"""
        return {
            "host": self.host,
            "port": self.port,
            "user": self.user,
            "password": self.password,
            "database": self.database,
            "charset": self.charset,
            "autocommit": self.autocommit,
            "ssl_disabled": self.ssl_disabled
        }

# 具体数据库实例配置
class MainMySQLConfig(MySQLConfig):
    """主业务数据库配置"""
    
    def __init__(self):
        super().__init__()
        self.host = "db-main.example.com"
        self.port = 3306
        self.user = "app_user"
        self.password = "secure_pass"
        self.database = "main_db"
        self.pool_size = 10  # 更大的连接池

class LogMySQLConfig(MySQLConfig):
    """日志数据库配置"""
    
    def __init__(self):
        super().__init__()
        self.host = "log-db.example.com"
        self.port = 3307
        self.user = "log_user"
        self.password = "log_pass"
        self.database = "app_logs"
        self.autocommit = True  # 日志自动提交

2. MySQL连接器

# connectors/mysql_connector.py
import mysql.connector
from mysql.connector import pooling, Error
from configs.mysql_config import MySQLConfig
from connectors.base_connector import BaseDBConnector

class MySQLConnector(BaseDBConnector):
    """MySQL数据库连接器"""
    
    def __init__(self, config: MySQLConfig):
        super().__init__(config)
        self._pools = {}  # 连接池缓存
        
    def connect(self, config_name: str = "default"):
        """建立数据库连接"""
        if config_name not in self._pools:
            # 创建新连接池
            params = self.config.get_connection_params()
            pool_config = {
                "pool_name": f"{config_name}_pool",
                "pool_size": self.config.pool_size,
                **params
            }
            
            try:
                self._pools[config_name] = pooling.MySQLConnectionPool(**pool_config)
                self._connections[config_name] = self._pools[config_name].get_connection()
            except Error as e:
                raise ConnectionError(f"MySQL连接失败: {e}")
                
        return self._connections[config_name]
    
    def close(self, config_name: str = "default"):
        """关闭数据库连接"""
        if config_name in self._connections:
            conn = self._connections.pop(config_name)
            conn.close()
            
    def execute_query(self, query: str, params=None, config_name: str = "default"):
        """执行查询操作"""
        conn = self.connect(config_name)
        try:
            with conn.cursor(dictionary=True) as cursor:
                cursor.execute(query, params)
                return cursor.fetchall()
        except Error as e:
            raise RuntimeError(f"查询执行失败: {e}")
    
    def execute_command(self, command: str, params=None, config_name: str = "default"):
        """执行写操作"""
        conn = self.connect(config_name)
        try:
            with conn.cursor() as cursor:
                cursor.execute(command, params)
                affected = cursor.rowcount
                if not self.config.autocommit:
                    conn.commit()
                return affected
        except Error as e:
            conn.rollback()
            raise RuntimeError(f"命令执行失败: {e}")

四、其他数据库配置与连接器

1. MongoDB配置与连接器

# configs/mongo_config.py
from configs.base_config import BaseDBConfig

class MongoDBConfig(BaseDBConfig):
    """MongoDB专用配置"""
    
    def __init__(self):
        super().__init__()
        self.uri = ""
        self.db_name = ""
        self.tls = False
        self.replica_set = ""
        
    def get_connection_params(self) -> dict:
        return {
            "host": self.uri,
            "tls": self.tls,
            "replicaSet": self.replica_set
        }

class UserProfileMongoConfig(MongoDBConfig):
    """用户档案数据库配置"""
    
    def __init__(self):
        super().__init__()
        self.uri = "mongodb://user:pass@cluster0.example.com:27017"
        self.db_name = "user_profiles"
        self.tls = True
# connectors/mongo_connector.py
from pymongo import MongoClient
from configs.mongo_config import MongoDBConfig
from connectors.base_connector import BaseDBConnector

class MongoDBConnector(BaseDBConnector):
    """MongoDB数据库连接器"""
    
    def __init__(self, config: MongoDBConfig):
        super().__init__(config)
        self._clients = {}  # 客户端缓存
        
    def connect(self, config_name: str = "default"):
        """建立数据库连接"""
        if config_name not in self._clients:
            params = self.config.get_connection_params()
            try:
                self._clients[config_name] = MongoClient(**params)
                self._connections[config_name] = self._clients[config_name][self.config.db_name]
            except Exception as e:
                raise ConnectionError(f"MongoDB连接失败: {e}")
        return self._connections[config_name]
    
    def get_collection(self, collection_name: str, config_name: str = "default"):
        """获取集合对象"""
        db = self.connect(config_name)
        return db[collection_name]
    
    # MongoDB不需要传统SQL查询方法
    def execute_query(self, query: dict, collection_name: str, config_name: str = "default"):
        """执行MongoDB查询"""
        collection = self.get_collection(collection_name, config_name)
        return list(collection.find(query))
    
    def execute_command(self, command: dict, collection_name: str, config_name: str = "default"):
        """执行MongoDB写操作"""
        # 这里简化处理,实际需要区分insert/update/delete
        collection = self.get_collection(collection_name, config_name)
        if command.get("insert"):
            return collection.insert_many(command["data"])
        elif command.get("update"):
            return collection.update_many(command["filter"], command["update"])
        elif command.get("delete"):
            return collection.delete_many(command["filter"])
        else:
            raise ValueError("无效的MongoDB命令")

2. Redis配置与连接器

# configs/redis_config.py
from configs.base_config import BaseDBConfig

class RedisConfig(BaseDBConfig):
    """Redis专用配置"""
    
    def __init__(self):
        super().__init__()
        self.host = "localhost"
        self.port = 6379
        self.db = 0
        self.decode_responses = True
        self.ssl = False
        
    def get_connection_params(self) -> dict:
        return {
            "host": self.host,
            "port": self.port,
            "db": self.db,
            "decode_responses": self.decode_responses,
            "ssl": self.ssl
        }

class SessionRedisConfig(RedisConfig):
    """会话缓存配置"""
    
    def __init__(self):
        super().__init__()
        self.host = "cache.example.com"
        self.db = 1
        self.decode_responses = False  # 原始字节数据
# connectors/redis_connector.py
import redis
from configs.redis_config import RedisConfig
from connectors.base_connector import BaseDBConnector

class RedisConnector(BaseDBConnector):
    """Redis数据库连接器"""
    
    def __init__(self, config: RedisConfig):
        super().__init__(config)
        
    def connect(self, config_name: str = "default"):
        """建立Redis连接"""
        if config_name not in self._connections:
            params = self.config.get_connection_params()
            try:
                self._connections[config_name] = redis.Redis(**params)
                # 测试连接
                self._connections[config_name].ping()
            except Exception as e:
                raise ConnectionError(f"Redis连接失败: {e}")
        return self._connections[config_name]
    
    # Redis不需要传统SQL查询方法
    def execute_query(self, key: str, config_name: str = "default"):
        """获取键值"""
        conn = self.connect(config_name)
        return conn.get(key)
    
    def execute_command(self, command: str, *args, config_name: str = "default"):
        """执行Redis命令"""
        conn = self.connect(config_name)
        return conn.execute_command(command, *args)

3. DuckDB配置与连接器

# configs/duckdb_config.py
from configs.base_config import BaseDBConfig

class DuckDBConfig(BaseDBConfig):
    """DuckDB专用配置"""
    
    def __init__(self):
        super().__init__()
        self.path = ":memory:"  # 默认内存数据库
        self.read_only = False
        self.config = {}  # 额外配置
        
    def get_connection_params(self) -> dict:
        return {
            "database": self.path,
            "read_only": self.read_only,
            "config": self.config
        }

class AnalyticsDuckDBConfig(DuckDBConfig):
    """分析数据库配置"""
    
    def __init__(self):
        super().__init__()
        self.path = "/data/analytics.duckdb"
        self.config = {"threads": 8}  # 使用8线程
# connectors/duckdb_connector.py
import duckdb
from configs.duckdb_config import DuckDBConfig
from connectors.base_connector import BaseDBConnector

class DuckDBConnector(BaseDBConnector):
    """DuckDB数据库连接器"""
    
    def __init__(self, config: DuckDBConfig):
        super().__init__(config)
        
    def connect(self, config_name: str = "default"):
        """建立DuckDB连接"""
        if config_name not in self._connections:
            params = self.config.get_connection_params()
            try:
                self._connections[config_name] = duckdb.connect(**params)
                
                # 应用额外配置
                for key, value in params["config"].items():
                    self._connections[config_name].execute(f"SET {key} = {value}")
                    
            except Exception as e:
                raise ConnectionError(f"DuckDB连接失败: {e}")
        return self._connections[config_name]
    
    def execute_query(self, query: str, config_name: str = "default"):
        """执行查询返回DataFrame"""
        conn = self.connect(config_name)
        return conn.execute(query).fetchdf()
    
    def execute_command(self, command: str, config_name: str = "default"):
        """执行DDL/DML语句"""
        conn = self.connect(config_name)
        return conn.execute(command)

五、业务层统一使用接口

数据库管理器

# connectors/db_manager.py
from configs import mysql_config, mongo_config, redis_config, duckdb_config
from connectors import mysql_connector, mongo_connector, redis_connector, duckdb_connector

class DBManager:
    """多数据库统一管理"""
    
    _instances = {}  # 连接器实例缓存
    
    # 配置实例
    MYSQL_MAIN = mysql_config.MainMySQLConfig()
    MYSQL_LOG = mysql_config.LogMySQLConfig()
    MONGO_PROFILE = mongo_config.UserProfileMongoConfig()
    REDIS_SESSION = redis_config.SessionRedisConfig()
    DUCKDB_ANALYTICS = duckdb_config.AnalyticsDuckDBConfig()
    
    @classmethod
    def get_mysql(cls, config: MySQLConfig = MYSQL_MAIN) -> mysql_connector.MySQLConnector:
        """获取MySQL连接器"""
        key = f"mysql_{id(config)}"
        if key not in cls._instances:
            cls._instances[key] = mysql_connector.MySQLConnector(config)
        return cls._instances[key]
    
    @classmethod
    def get_mongo(cls, config: MongoDBConfig = MONGO_PROFILE) -> mongo_connector.MongoDBConnector:
        """获取MongoDB连接器"""
        key = f"mongo_{id(config)}"
        if key not in cls._instances:
            cls._instances[key] = mongo_connector.MongoDBConnector(config)
        return cls._instances[key]
    
    @classmethod
    def get_redis(cls, config: RedisConfig = REDIS_SESSION) -> redis_connector.RedisConnector:
        """获取Redis连接器"""
        key = f"redis_{id(config)}"
        if key not in cls._instances:
            cls._instances[key] = redis_connector.RedisConnector(config)
        return cls._instances[key]
    
    @classmethod
    def get_duckdb(cls, config: DuckDBConfig = DUCKDB_ANALYTICS) -> duckdb_connector.DuckDBConnector:
        """获取DuckDB连接器"""
        key = f"duckdb_{id(config)}"
        if key not in cls._instances:
            cls._instances[key] = duckdb_connector.DuckDBConnector(config)
        return cls._instances[key]

业务服务使用示例

# services/user_service.py
from connectors.db_manager import DBManager

class UserService:
    """用户服务 - 多数据库操作"""
    
    def __init__(self):
        # 初始化各数据库连接器
        self.mysql = DBManager.get_mysql()
        self.mongo = DBManager.get_mongo()
        self.redis = DBManager.get_redis()
    
    def get_user_data(self, user_id: int):
        """获取用户完整数据"""
        # MySQL获取基本信息
        sql = "SELECT * FROM users WHERE id = %s"
        user_info = self.mysql.execute_query(sql, (user_id,))[0]
        
        # MongoDB获取档案
        user_profile = self.mongo.execute_query(
            {"user_id": user_id}, 
            collection_name="profiles"
        )
        
        # Redis获取会话状态
        session_state = self.redis.execute_query(f"session:{user_id}")
        
        return {
            "info": user_info,
            "profile": user_profile,
            "session": session_state
        }
    
    def update_user(self, user_id: int, data: dict):
        """更新用户信息"""
        # MySQL更新基本信息
        update_sql = """
        UPDATE users 
        SET name = %s, email = %s 
        WHERE id = %s
        """
        self.mysql.execute_command(
            update_sql, 
            (data["name"], data["email"], user_id)
        )
        
        # MongoDB更新档案
        self.mongo.execute_command(
            {"update": True},
            collection_name="profiles",
            command={
                "filter": {"user_id": user_id},
                "update": {"$set": data["profile"]}
            }
        )
        
        # Redis更新缓存
        self.redis.execute_command(
            "SET", 
            f"user:{user_id}", 
            data["cache_data"], 
            "EX", 3600
        )

六、架构优势与最佳实践

设计优势

  1. 统一接口:所有数据库连接器继承自同一基类,提供一致API
  2. 配置继承:基础配置复用,专用配置扩展
  3. 类型安全:强类型配置和连接器,减少错误
  4. 连接复用:管理器确保连接器单例
  5. 多实例支持:同一数据库类型支持多个配置实例
  6. 开箱即用:预置主流数据库实现
  7. 可扩展性:轻松添加新数据库支持

命名规范建议

  1. 配置类:[数据库类型]Config + [用途]Config
    (e.g., MySQLConfig, MainMySQLConfig)

  2. 连接器类:[数据库类型]Connector
    (e.g., MySQLConnector, MongoDBConnector)

  3. 配置实例:全大写描述性名称
    (e.g., MYSQL_MAIN, REDIS_SESSION)

  4. 方法命名:

    • connect(): 建立连接
    • close(): 关闭连接
    • execute_query(): 执行查询
    • execute_command(): 执行写操作

最佳实践

  1. 环境区分:使用环境变量切换配置

    class MainMySQLConfig(MySQLConfig):
        def __init__(self):
            super().__init__()
            env = os.getenv("ENV", "dev")
            self.host = f"db-{env}.example.com"
    
  2. 配置加密:敏感数据加密存储

    from cryptography.fernet import Fernet
    
    class SecureConfig:
        @staticmethod
        def decrypt(encrypted: str) -> str:
            cipher = Fernet(os.getenv("CONFIG_KEY"))
            return cipher.decrypt(encrypted.encode()).decode()
    
    # 在配置中使用
    self.password = SecureConfig.decrypt(ENCRYPTED_PASSWORD)
    
  3. 连接监控:定期检查连接健康

    import threading
    import time
    
    def monitor_connections():
        while True:
            for name, connector in DBManager._instances.items():
                status = connector.health_check()
                print(f"{name} 状态: {'OK' if status else 'FAIL'}")
            time.sleep(DBManager.MYSQL_MAIN.monitor_interval)
    
    threading.Thread(target=monitor_connections, daemon=True).start()
    
  4. 资源清理:应用退出时关闭所有连接

    import atexit
    
    @atexit.register
    def cleanup():
        for connector in DBManager._instances.values():
            connector.close_all()
    

结语:通过这种基于继承的配置架构和统一命名的连接器设计,我们实现了多数据库的高效管理。这种设计既保持了配置的灵活性,又提供了代码的一致性,是中型到大型项目的理想选择。

扩展方向:

  1. 添加异步IO支持
  2. 集成分布式配置中心
  3. 实现数据库迁移工具
  4. 添加ORM集成层
  5. 开发Web管理界面

安全提示:

  • 生产环境禁用默认配置
  • 定期轮换数据库凭证
  • 使用网络隔离限制数据库访问
  • 加密敏感配置数据
  • 实施最小权限原则

关键词:Python数据库架构、多数据库管理、配置继承模式、数据库连接器设计、企业级Python开发

Python连接MySQL终极指南:从基础到高级ORM应用 🔥 “还在用传统方式连接MySQL?本文揭秘PyMySQL最新性能优化技巧,轻松提升300%查询效率!💎 “文末赠送『MySQL避坑手册』,解决90%开发者都会遇到的连接池难题! 阅读详情

相关推荐

连接器与MCP的关系:从设计稿到APP的实战指南

在AI驱动的软件开发流程中,连接器与模型上下文协议(MCP)是两种常见但易混淆的技术手段。连接器负责打通外部系统,如数据库、设计稿平台,提供具体的读写能力;而MCP则是一种标准化工具调用协议,让AI应用能以统一方式发现并调用外部服务。理解两者的定位与协作方式,是提升AI编程效率的关键。通过Workbuddy等AI开发工具,结合连接器与MCP,可实现从设计稿到可运行APP的自动化生成,并支持数据库查询等复杂业务逻辑。本文从基础概念出发,解析连接器与MCP的工作原理,并给出配置示例及常见问题排查思路,帮助开发者

weixin_34241036的博客 415

Python安装后测试连接MySQL数据库

一、Python安装 1.通过【https://www.python.org/】链接进Python官网,点击下载按钮进行跳转。 2.在跳转后页面选择你想要下载的版本,我本机安装的是3.9的版本。

Knight_Key的博客 3637

连接器与MCP:Workbuddy一键设计稿变APP核心链路拆解

在AI应用构建与自动化工作流中,MCP(Model Context Protocol)作为标准协议,解决了AI模型无法直接访问外部数据的问题,而连接器则是将不同平台能力封装为统一接口的落地实现。二者的组合,相当于“标准+实现”的配套关系,让AI可以按统一方式调用设计稿、数据库、API等外部资源。这种架构屏蔽了平台差异,降低了多系统集成的开发成本,使得设计稿转APP、业务系统自动搭建、数据库辅助查询等场景得以高效实现。基于这一原理,本文以Workbuddy为例,详细拆解从连接器配置、MCP Server启动到

weixin_30908941的博客 363

【python开发】安装&配置&启动+数据库管理+表管理+数据行管理+python操作Mysql及相关安全的问题

安装好之后打开终端,输入which mysql,回车查看mysql安装路径/usr/local/mysql/bin/mysql,然后输入/usr/local/mysql/bin,进入到mysql中,输入mysql -u root -p,弹出输入密码的提示,然后输入mysql密码,这就已经启动了mysql。如果需要启动mysql,只需要打开终端输入mysql -u root -p,如果不使用mysql了就可以输入exit退出系统。(3)重庆之后无需密码就可登陆 mysql -u -root -p;

weixin_51589123的博客 2850

连接器与MCP有什么区别?从设计稿到APP的完整链路解析

在AI应用搭建平台中,连接器与MCP是容易混淆却又缺一不可的概念。连接器(Connector)是应用运行时的数据通道,负责持久化读写数据库、调用API;MCP(Model Context Protocol)则是构建期的模型上下文协议,让AI生成代码时能读取真实表结构、设计稿信息。理解两者分工,是打通“设计稿→数据模型→页面生成→运行时数据绑定”完整链路的关键。在Workbuddy等平台中,正确配置数据库MCP与连接器,能实现一键生成可运行的APP,并精准定位页面生成或数据连接中的异常。本文以最小闭环为例,拆

weixin_34375251的博客 441

[Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。前一篇文章讲述了Requests库爬取豆瓣电影TOP250,并存储至CSV文件。豆瓣TOP250是非常适合入门的案例,也能普及简单的预处理知识。这篇文章将普及数据库操作知识,这也为后续网络爬虫存储至数据库奠定基础。本文详细介绍MySQL安装、SQL语句和Python操作数据库知识,希望对您有所帮助。

杨秀璋的专栏 8665

【Python】在python中使用MySQL

最近接了一个小项目,需要使用数据库来处理后台的数据,虽然此前有下载安装过MySQL,但是很遗憾的是当时并没有花很多时间,也就导致数据库基本没学明白,正好趁这次机会来好好学习一下MySQL。一般程序运行,产生的数据都是存在内存当中,当程序终止的时候,通常要写入文件保存到磁盘,而数据库就是一种便捷地交互大量数据的方式,尤其是查找功能的实现。因此,简单来说,数据库就是程序便捷存取大量数据的地方。数据库有很多类型,但在Windows端比较推荐的是MySQL和SQLite。

记录学习成长之路,进一寸有进一寸的欢喜 1万+

STM32单片机语音提示盲人拐杖整点报时夜间警示超声波测距

STM32单片机语音提示盲人拐杖整点报时夜间警示超声波测距 关键词:语音提示盲人拐杖 整点报时 超声波测距拐杖

LS840233684的博客 2046

MySQL数据库(Python)

表示取消自动提交事务,需要手动提交,不然操作不会提交到数据库,开启事务之后,对数据库的表格操作之后,如果不执行提交,查询得到的结果只是当前的结果,当前结果并没有保存至数据库,只是虚拟的表格,使用。在启动数据库,使用数据库之后,可以在该数据库里面创建表格,对表格进行各种操作,一个数据库可以拥有多个表格,数据保存在表格中。:对数据库执行增删改查的时候,默认会在事务环境中进行操作,操作完成后要进行手动提交, 如果不提交,程序默认操作为回滚,即更改的操作不被记录,事务提交操作由数据库连接对象来完成(

weixin_46287157的博客 4738

国产化软件设计:遵循信创要求,助力信息技术自主创新

支持国产操作系统、CPU、数据库和中间件。确保网络通信的身份鉴别、数据传输机密性和完整性。实现应用和数据层的身份鉴别、数据传输机密性完整性、数据存储机密性完整性。依托法院密码服务平台提供的商用密码能力。

qq_41186565的博客 3371

告别环境配置噩梦:用Docker Desktop + WSL2在Windows上5分钟搞定vLLM运行环境

本文详细介绍了如何在Windows系统上使用Docker Desktop和WSL2快速搭建vLLM开发环境,5分钟内完成配置。通过容器化技术解决传统环境配置中的依赖冲突、环境污染等问题,提供一键复用的高效方案,特别适合AI开发者快速部署和测试vLLM框架。

weixin_28728495的博客 500

python库设置,python项目之数据库的设置

django可支持大部分主流数据库,如Mysql,MongoDB, Oracle,Redis等等,可同时设置多个一、Mysql数据库的设置1. 数据库接口设置DATABASES ={'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'MyBlog','USER': 'zgzeng','PASSWORD': 'zgzeng','HOST...

weixin_39953673的博客 702

PyTorch实战:用FGSM攻击MNIST分类器(附可视化对比)

本文通过PyTorch实战演示了如何使用FGSM对抗攻击方法攻击MNIST手写数字分类器。文章详细解析了FGSM攻击原理,提供了从环境搭建、模型准备到攻击实施、可视化对比的完整代码实战流程,并探讨了对抗样本的生成与模型鲁棒性评估。

3a9bq4r8t2y的博客 216

详细!PyCharm连接MySQL数据库教程+心得

第一步:安装MySQL 下载地址:https://dev.mysql.com/downloads/mysql/ 下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 C:\web\mysql-8.0.11 下。 接下来我们需要配置下 MySQL 的配置文件 打开刚刚解压的文件夹 C:\web\mysql-8.0.11 ,在该文件夹下创建 my.ini 配置文件,编辑 my....

springhammer的博客 2万+

vietjetair 航空的webpack多参数生成学习

工作内不是特别多,居安思危,有一个抓机票信息的公司面试前竟然需要做面试题,这就是一个题。看了下,有点麻烦,webpack 最初不得要领,看了下资料,找了个框架,练了两个简单的,搞这个吧。入库需要自己找,有几个参数不是明文的,算法不是很复杂,位置不太好找。整体难度一般。

liu_yueyang的博客 1509

13、数据可视化与分组操作:Danfo.js 实战指南

本文深入介绍了如何使用 Danfo.js 进行数据可视化与分组操作。内容涵盖多种图表的创建与配置,如折线图、散点图、箱线图、小提琴图、直方图和柱状图,并结合 Plotly.js 实现丰富的交互式可视化效果。同时,详细讲解了数据聚合的‘分割-应用-组合’模式,包括分组数据、遍历分组、apply 方法及 agg 聚合操作,帮助开发者高效处理和分析结构化数据。适用于 Dnotebook、HTML 及主流前端框架的应用场景。

o1p2q3r的博客 98

使用Python进行数据库连接与操作SQLite和MySQL

在现代应用程序开发中,与数据库进行交互是至关重要的一环。Python提供了强大的库来连接和操作各种类型的数据库,其中包括SQLite和MySQL。本文将介绍如何使用Python连接这两种数据库,并进行基本的操作,包括创建表、插入数据、查询数据等。

一键难忘的博客 5723

半车(前后、左右)、整车悬架详细推导建模和simulink仿真分析

用达朗贝尔定理依据悬架数学模型,得到悬架模型微分方程,分别用simulink建立前后半车、左右半车悬架;结合转向2自由度模型与半车侧倾模型,对模型考虑相干性、延时性的C级随机路面下,仿真分析给定角阶跃输入下的侧倾稳定性。

Mr.邹的博客 1万+

玩转ClaudeCode:用Database-MCP实现自然语言操作数据库

本文介绍了使用ClaudeCode和Database MCP将前端硬编码的省市信息迁移到数据库的操作步骤。主要内容包括:1)安装配置MCP数据库服务器;2)连接MySQL/SQLServer等数据库;3)将硬编码的省市数据转换为数据库表,并自动创建后端接口替代前端硬编码逻辑。通过ClaudeCode工具,开发者可以快速完成数据库操作和代码重构,提升开发效率。实施前需确保已安装Node.js18+和ClaudeCode CLI环境。

踏雨歌青春,诗酒趁年华 2万+

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)

王老师青少年编程 3388

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python的安装与连接MySQL数据库

10. 在 "Configuring the MySQL Server" 页面上,你可以配置 MySQL 服务器的一些高级选项,例如日志文件位置、最大连接数等。8. 在 "Configuring the MySQL Server" 页面上,你可以设置 MySQL 服务器的配置选项,例如端口号、字符集等。点击 "Browse" 按钮选择其他位置,或者接受默认位置。5. 在 "Choosing a Setup Type" 页面上,选择 "Custom" 安装类型,以便可以更详细地配置安装。

2302_76521190的博客 2214

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【AI总结】python连接MySQL(4)- 轻量级多数据库配置管理方案

配置集中化所有数据库配置集中在单一文件,一目了然开箱即用预置多种数据库连接器,无需重复造轮子即插即用新增数据库只需添加配置和连接器资源高效连接池和连接缓存减少开销环境友好轻松支持多环境配置切换类型清晰分类管理不同数据库配置,避免混淆业务解耦服务层无需关心具体连接细节。

AlienProgrammer的博客 801

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

python连接数据库

python连接数据库,pymysql

jakelihua 5812

Mage AI 集成指南:使用 Snowflake Source 连接器读取云数据仓库数据

本指南基于 Mage AI 开源仓库中 `mage_integrations` 包的 Snowflake Source 实现,系统讲解如何通过 Mage 的数据集成(Data Integration)框架从 Snowflake 云数据仓库中提取数据。读完本文,你将掌握 Snowflake Source 的全部连接配置参数、密码与密钥对(key-pair)两种认证方式、批处理拉取机制的原理与调优方法

gitblog_01174的博客 383

【AI总结】python连接MySQL(3)- 数据库配置集中化管理:Python多数据库连接终极方案

本文将展示如何将MySQL连接配置抽象为公共常量,实现多数据库环境下的统一管理,彻底解决配置分散问题!

AlienProgrammer的博客 1206

比迪丽模型与MySQL数据库集成:艺术元数据管理系统开发

本文介绍了如何在星图GPU平台上自动化部署比迪丽(Videl/Bidili)AI绘画LoRA角色模型,并实现与MySQL数据库的集成,构建艺术元数据管理系统。该系统能够自动记录AI生成图片的元数据,如风格标签和提示词,便于用户高效管理和检索作品,提升创作流程的组织性。

weixin_30820933的博客 377
上一篇: 【AI总结】python连接MySQL(4)- 轻量级多数据库配置管理方案
下一篇: 【保姆级喂饭教程】python基于mysql-connector-python的数据库操作通用封装类(连接池版)
荔枝吻
博客等级 码龄5年 533粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝吻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值