You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3下MongoDB如何通过UUID自动创建并指定数据库名?

解决用UUID动态指定MongoDB数据库名的问题

Got it, let's fix this. The core issue here is that you're using attribute access (connection.main_db_192_168_1_4) which doesn't support dynamic variable names. PyMongo actually lets you use bracket notation (just like your example code for test-database) to dynamically specify database names using variables—perfect for your UUID use case.

Step 1: 获取系统UUID

首先你需要拿到对应系统的UUID,这个可以从环境变量、配置文件读取,或者由客户端连接时主动发送。举两个常见实现例子:

# 示例1:从环境变量中读取UUID
import os
system_uuid = os.getenv('SYSTEM_UUID')  # 启动服务时设置该环境变量即可

# 示例2:客户端连接后主动发送UUID(accept后接收)
# conn, address = conn_sock.accept()
# system_uuid = conn.recv(36).decode().strip()  # UUID固定为36个字符长度

Step 2: 用UUID变量动态访问数据库

把原来硬编码的数据库访问代码替换为括号访问方式,用UUID变量作为数据库名。下面是修改后的main()函数关键部分:

def main():
    db_con = db_conn.db_connection()
    connection = db_con.connections()
    ob_coms = coms.lis_main()
    ob_listen_port = port_scanner.listen_port_sca()
    port_status = get_status_ports.Spetial_Agent()

    # --- 以下是修改的核心代码 ---
    # 获取系统UUID(替换为你的实际获取逻辑)
    system_uuid = os.getenv('SYSTEM_UUID')
    # 用括号访问方式,通过UUID变量动态指定数据库
    db = connection[system_uuid]
    # --- 修改结束 ---

    list_bad = ["python","firefox"]
    port_num = 2882
    status = "listen"
    pid = []
    if ob_listen_port.special_port_scanner(port_num, status) is None:
        conn_sock = ob_coms.port_listen()
        conn, address = conn_sock.accept()
        while True:
            content = db.all_result.find_one(sort=[('date', -1)])
            dict_key = content["result_back"].keys()
            for in_content in dict_key:
                if content["result_back"][in_content]["proc_name"] in list_bad:
                    if content["result_back"][in_content]["pid_conn_back"] in pid:
                        pass
                    else:
                        pid.append(content["result_back"][in_content]["pid_conn_back"])

为什么这种方式可行

  • PyMongo的MongoClient(旧版本的Connection)支持用括号访问来通过字符串名称查找数据库,而这个字符串可以是变量。
  • 属性访问(比如connection.my_db)只适用于硬编码的名称——Python会把属性名当作字面量字符串,无法用变量替代。
  • UUID格式完全符合MongoDB数据库名的命名规则,不会包含/\. "$这类非法字符,无需额外处理格式问题。

额外优化:添加UUID合法性校验

为了避免无效UUID导致的错误,建议在使用前添加校验逻辑:

import uuid

try:
    # 验证字符串是否为合法UUID
    uuid.UUID(system_uuid)
except ValueError:
    print(f"无效UUID格式: {system_uuid}")
    # 这里可以添加错误处理逻辑(比如日志记录、退出服务等)

内容的提问来源于stack exchange,提问作者haprodev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:03:52