1

让我先说我才刚刚开始使用 Python,到目前为止我真的很喜欢它!

我正在尝试创建一个 Python 脚本,该脚本根据另一个值更新 MySQL 数据库中的某些值。我的那部分大部分都在工作,但无论我尝试什么,我都无法让脚本正确地迭代到其他行。目前,它仅从第一行获取值(ost_user__cdata中的位置)并将其应用于目标列中的每一行(ost_user中的org_id)。

如果有人感兴趣,我在这里尝试完成的是根据最终用户在其个人资料中选择的自定义字段更新用户在 osTicket 中的组织(在这种情况下,“组织”将代表用户的哪个办公地点是在,所以我希望用户能够自己选择他们的位置,并自动将他们放在正确的组织中)。osTicket 不允许在应用程序中执行此操作(只有代理可以设置用户的组织,这对于通常的使用方式很有意义),但是我发现可以通过数据库进行设置。

非常感谢您对此的任何帮助!请在下面查看我的脚本。

谢谢!

import mysql.connector

db = mysql.connector.connect(
    host="ip",
    user="user",
    passwd="pass",
    database="db"
    )

cursor = db.cursor(buffered=True)
cursor2 = db.cursor(buffered=True)
cursor.execute("SELECT id from ost_user")
goCheck = cursor.fetchone()

if (goCheck is not None):

    #cursor.execute("SELECT * from ost_user__cdata WHERE user_id="+str(dbid))
    ##cursor.execute("SELECT * from ost_user")
    cursor.execute("SELECT id from ost_user")
    numrows = cursor.rowcount
    row1 = cursor.fetchall()

    #for id in cursor:
    for id in range(0,numrows):
        cursor2.execute("SELECT id from ost_user")
        getID = cursor2.fetchone()
        dbid = str(getID[0])
        cursor2.execute("SELECT location from ost_user__cdata WHERE user_id="+(dbid))
        loca = cursor2.fetchone()
        sel = str(loca[0])
        
        if (sel == "1"):
            loc = "8"

        elif (sel == "2"):
            loc = "2"

        elif (sel == "3"):
            loc = "3"

        elif (sel == "4"):
            loc = "4"

        elif (sel == "5"):
            loc = "5"

        elif (sel == "6"):
            loc = "6"

        elif (sel == "7"):
            loc = "7"

        elif (sel == "8"):
            loc = "9"

        else:
            print("Location not recognized.")
            quit()

        cursor2.execute("UPDATE ost_user SET org_id="+(loc),"WHERE id="+(dbid))
        db.commit()
        print("User ID: "+(dbid),"added to org: "+(loc))
            

else:
    print("?")
    quit()

正在运行的输出(当前 ost_user 表中只有 2 个条目,ID 为 3 和 4 - 用户 3 确实属于 org 9,但用户 4 应该在 org 5 中):

User ID: 3 added to org: 9
User ID: 3 added to org: 9
4

1 回答 1

0

使用单个数据库查询来执行此操作,而不是 Python 循环。您可以使用CASE表达式来处理位置不直接映射到组织 ID 的情况。

UPDATE ost_user AS u
JOIN ost_user__cdata AS c ON u.id = c.user_id
SET u.org_id = 
    CASE c.location
        WHEN '1' THEN '8'
        WHEN '8' THEN '9'
        ELSE c.location
    END
于 2021-12-28T18:40:39.787 回答