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

为何数据未写入指定MySQL单元格?FreePBX适配脚本问题

问题分析与解决脚本

核心问题

你的脚本错误使用了executemany批量更新方法,导致多次执行UPDATE语句覆盖单元格内容,且没有将处理后的列表合并为单个字符串写入单元格,最终出现单元格被清空但无有效数据的情况。

修正后的脚本

#!/usr/bin/python3

import mysql.connector

try:
    connection = mysql.connector.connect(host='localhost',
                                         database='asterisk',
                                         user='freepbxuser',
                                         password='',
                                         autocommit=True)
    # 直接查询cell字段,无需额外CONCAT处理
    sql_select_Query = "SELECT cell FROM userman_users"
    cursor = connection.cursor()
    cursor.execute(sql_select_Query)
    # 一步过滤掉NULL值,避免冗余操作
    dirty_text = [item[0] for item in cursor.fetchall() if item[0] is not None]
    
    SYMBOLS = '{}()[].,:;+-*/&|<>=~'
    clear_text = []
    for element in dirty_text:
        temp = ""
        for ch in element:
            if ch not in SYMBOLS:
                temp += ch
        clear_text.append(temp)
    
    # 将所有处理后的内容合并为单个字符串,可根据FreePBX要求调整分隔符(比如换成\n用换行分隔)
    combined_values = ', '.join(clear_text)
    
    # 使用execute更新单条记录,而非批量更新
    cursor.execute("""
    UPDATE pinsets
    SET passwords=%s
    WHERE pinsets_id=1
    """, (combined_values,))
    
    print("数据更新成功")
except mysql.connector.Error as e:
    print("数据库错误:", e)
finally:
    if connection.is_connected():
        cursor.close()
        connection.close()

关键修正点

  • 替换批量更新为单条更新:用execute替代executemany,避免多次覆盖同一单元格内容。
  • 合并列表为单个字符串:通过join方法将所有处理后的内容拼接成一个字符串,满足FreePBX将整个列表放入单个单元格的要求。
  • 简化数据过滤逻辑:用列表推导式直接过滤NULL值,减少代码冗余。
  • 移除无用的CONCAT操作:直接查询cell字段即可,CONCAT(cell)在此场景下无实际作用。

注意事项

如果FreePBX对passwords字段的格式有特定要求(比如需要换行分隔、特定符号分隔),只需修改', '.join(clear_text)中的分隔符即可,例如换成'\n'.join(clear_text)实现换行分隔。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:02:11