为何数据未写入指定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
相关产品推荐
相关产品推荐

