Python:遍历 MySQL table 中的行

Python: Iterating over rows in a MySQL table

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

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

如果有人感兴趣,我想在这里完成的是根据最终用户在其个人资料中选择的自定义字段更新 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 table 中只有 2 个条目,ID 为 3 和 4 - 用户 3 确实属于组织 9,但是用户4 应该在组织 5):

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

使用单个数据库查询执行此操作,而不是 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