【发布时间】:2021-05-12 20:09:18
【问题描述】:
我需要通过本地 python 脚本在我的 wordpress 中设置一些用户元数据。因此我不能使用 WP update_user_meta ——它必须手动完成。
import mysql.connector as mysql
cnx = mysql.connect(host=HOST, database=DATABASE, user=USER, password=PASSWORD)
cursor = cnx.cursor()
get_meta = ("SELECT * FROM `ff_usermeta` WHERE `user_id`= 1 AND (`meta_key`='nickname' OR `meta_key`='info' OR `meta_key`='bg' OR `meta_key`='avatar' OR `meta_key`='profile_updated')")
cursor.execute(get_meta)
meta = cursor.fetchall()
#some processing of the result
cursor.execute(q, (...))
cnx.commit()
cursor.close()
cnx.close()
现在我需要检查结果是否包含每个键的元数据。 如果此用户的密钥已存在,则需要为此元运行 UPDATE。 如果该用户仍然没有此键的元数据,则必须插入新行。
if(there's no 'nickname' in meta_key on either of 5 or less rows):
q = ("INSERT INTO `ff_usermeta` ...")
else:
q = ("UPDATE `ff_usermeta` ...")
...还有 4 次这样的?.. 似乎是一个循环的好地方,但我真的不喜欢让它成为 5x 队列的想法,特别是因为将来可能会有更多的字段。
我正在考虑在 fetchall 结果中搜索 meta_key 中的匹配项,如果找到,则将所需数据添加到一个数组中,如果没有,则添加到另一个数组中。然后在最后只运行一次更新和一次插入,假设两者都不为空。如果我用 semi-php 风格写的话,大概是这样的:
if(in_array("nickname", meta))
for_update .= "`nickname`='"+data[0]+"', "
else:
fields .= "`nickname`, "
vals .= "'"+data[0]+"', "
if(in_array("bg", meta)):
for_update .= "`bg`='"+data[1]+"', "
else:
fields .= "`bg`, "
vals .= "'"+data[1]+"', "
if(for_update):
update = ("UPDATE `ff_usermeta` SET "+for_update+" WHERE 1")
if(fields):
insert = ("INSERT INTO `ff_usermeta`("+fields+") VALUES ("+vals+")")
但绝对不知道如何将它正确地翻译成 python。我不得不用谷歌搜索“为什么不能将一个字符串添加到另一个字符串”之类的东西。有什么建议吗?或者也许有更好的方法?谢谢!
【问题讨论】:
-
我们不知道你的结果集是什么样子的,写 SELECT * 也是一种不好的形式,要么你需要返回很多信息并花费时间,要么你真的需要所有信息,但是它仍然是糟糕的形式
-
user_meta 中只有 4 个字段:umeta_id、user_id、meta_key、meta_value。我认为如果我用 * 选择它们或通过命名它们中的每一个来选择它们并不重要,但我想我知道的 4 个中的一个并不需要太多。但这就像要解析的数字少了 1 个,而且每分钟不会超过 1 个用户。
-
你有 LIMIT 1,所以你只得到 1 个元值,最好也发布表格和数据,因为你需要一个更复杂的查询
-
限制为 5 个,而不是 1 个 - 或者您的意思是使其成为 5 个单独的选择请求,每个请求 1 行?我想那样做,但这不会在 mysql 上造成不必要的负载吗?
-
我看错了,您的查询不需要限制,因为当所有元键都存在时,它只会得到 5 行。
标签: python php mysql wordpress