Python操作WordPress用户元数据表实现存在则更新不存在则插入
实现方案
下面提供两种可直接落地的实现,均支持后续新增字段时仅修改配置项,无需调整核心逻辑。
方案1:匹配你思路的拆分更新/插入方案
完全符合你描述的「先查询拆分分类、再统一执行更新/插入」的逻辑,同时规避了字符串拼接带来的安全和语法问题:
import mysql.connector as mysql # 配置项,后续新增字段仅修改META_DATA即可 HOST = "数据库地址" DATABASE = "库名" USER = "数据库用户名" PASSWORD = "数据库密码" TABLE_NAME = "ff_usermeta" USER_ID = 1 META_DATA = { "nickname": "用户昵称", "info": "用户介绍", "bg": "背景图地址", "avatar": "头像地址", "profile_updated": "2024-01-01 00:00:00" } cnx = mysql.connect(host=HOST, database=DATABASE, user=USER, password=PASSWORD) cursor = cnx.cursor() # 查询用户现有指定元数据 get_meta = f""" SELECT * FROM `{TABLE_NAME}` WHERE `user_id` = %s AND `meta_key` IN ({','.join(['%s']*len(META_DATA))}) """ cursor.execute(get_meta, (USER_ID, *META_DATA.keys())) meta = cursor.fetchall() # 提取已存在的meta_key集合(表字段顺序为umeta_id[0], user_id[1], meta_key[2], meta_value[3],顺序不符可自行调整索引) existing_meta_keys = {row[2] for row in meta} # ------------ 业务处理区域 ------------ # 此处可添加你需要的结果处理逻辑,修改后直接更新META_DATA对应值即可 # 拆分插入和更新参数 insert_params = [] update_params = [] for meta_key, meta_value in META_DATA.items(): if meta_key in existing_meta_keys: update_params.append((meta_value, USER_ID, meta_key)) else: insert_params.append((USER_ID, meta_key, meta_value)) # 批量执行插入 if insert_params: insert_sql = f"INSERT INTO `{TABLE_NAME}` (`user_id`, `meta_key`, `meta_value`) VALUES (%s, %s, %s)" cursor.executemany(insert_sql, insert_params) # 批量执行更新 if update_params: update_sql = f"UPDATE `{TABLE_NAME}` SET `meta_value` = %s WHERE `user_id` = %s AND `meta_key` = %s" cursor.executemany(update_sql, update_params) cnx.commit() cursor.close() cnx.close()
方案2:免查询简化方案(推荐)
利用MySQL的INSERT ... ON DUPLICATE KEY UPDATE语法,配合WordPress usermeta表默认自带的(user_id, meta_key)联合唯一索引,可以省略前置查询步骤,自动判断插入或更新,代码更简洁效率更高:
import mysql.connector as mysql # 配置项,后续新增字段仅修改META_DATA即可 HOST = "数据库地址" DATABASE = "库名" USER = "数据库用户名" PASSWORD = "数据库密码" TABLE_NAME = "ff_usermeta" USER_ID = 1 META_DATA = { "nickname": "用户昵称", "info": "用户介绍", "bg": "背景图地址", "avatar": "头像地址", "profile_updated": "2024-01-01 00:00:00" } cnx = mysql.connect(host=HOST, database=DATABASE, user=USER, password=PASSWORD) cursor = cnx.cursor() # 单语句自动处理插入/更新 sql = f""" INSERT INTO `{TABLE_NAME}` (`user_id`, `meta_key`, `meta_value`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `meta_value` = VALUES(`meta_value`) """ params = [(USER_ID, k, v) for k, v in META_DATA.items()] cursor.executemany(sql, params) cnx.commit() cursor.close() cnx.close()
注意事项
- WordPress默认创建的usermeta表自带
(user_id, meta_key)联合唯一索引,无需额外创建,若为自定义表可手动执行ALTER TABLE ff_usermeta ADD UNIQUE KEY idx_user_meta (user_id, meta_key);添加索引。 - 所有SQL操作均使用参数化查询,避免SQL注入风险和特殊字符转义错误。
- 若需要和WordPress原生逻辑兼容存储数组/对象类型的元数据,可使用
phpserialize库做PHP格式的序列化/反序列化处理。
内容的提问来源于stack exchange,提问作者Hitoris
相关产品推荐
相关产品推荐

