Python 运行 SQL 查询 UPDATE 语句的脚本,循环遍历结果集中的每一行并更新列

Python Script to run SQL query UPDATE statement to loop through each row in result set and update columns

纽比从事我的第一个项目。抱歉这个解释。

我有 2 个 table: t1:master table 具有单行(唯一项目 ID)和 3 个状态字段,s1、s2、s3

t2:列出 table 并重复 project_id,其中包含 3 个状态字段 s1、s2、s3(以及此处不相关的其他数据)。 s1-3 字段中的值为 true(1) 或 false(0)

table1: project_id, status1, status2, status3

table2: recordid, project_id, name, status1, status2, status3

我正在使用 Python 到 运行 mysql 查询。

我想遍历 t1 中具有唯一记录 project_id 的行,然后每个 t1.project_id 查询 t2 加入 t1.projectid 并从 t2 最后一个状态条目更新 t1 状态字段对于每个 project/status 字段。

到目前为止,我已经完成了此操作,但无法将 id 传递给查询 2。再次抱歉,我真的在尝试通过这种方式学习一些东西。

import mysql.connector as msql
from mysql.connector import Error

Host = "192.168.0.10"
Port = 3306
User = ""       
Password = ""           
database = "projectdata"

conn = msql.connect(host=Host,port=Port, user=User, password=Password, database=database)
cursor1 = conn.cursor() 
cursor2 = conn.cursor()

sql = ("select id from table1 t1") cursor1.execute(sql) 
t1 = cursor1.fetchall()

for row in t1:

sql2 = ("SELECT recordid,project_id, s1, s2, s3
FROM table2 t2
WHERE t2.project_id = 't1.project_id'
ORDER by id, recordid DESC LIMIT 1")

cursor2.execute(sql) t2 = cursor2.fetchall()

我还没有到达更新 t1 部分,因为我还没有弄清楚如何通过 t1 进行循环并查询 t2 以获得更新 t1 的结果。

t1 before update
|project_id |s1 |s2 |s3 |
|-----------|---|---|---|
|1003       |   |   |   |
|1005       |   |   |   |
|1001       |   |   |   |
|1002       |   |   |   |

t2 example 
|recordid   |project_id |s1         |s2         |s3         |
|-----------|-----------|-----------|-----------|-----------|
|1          |1001       |           |0          |1          |
|2          |1002       |1          |           |0          |
|3          |1003       |           |1          |           |
|4          |1001       |0          |           |           |
|5          |1002       |0          |0          |           |
|6          |1005       |           |1          |           |
|7          |1003       |1          |           |1          |

t1 期望结果示例。实时状态字段是特定 project_id 的最后状态更改,按 t2

的记录 ID 排序
t1 after update
|project_id |s1         |s2         |s3         |
|-----------|-----------|-----------|-----------|
|1003       |1          |1          |1          |
|1005       |null       |1          |null       |
|1001       |0          |0          |1          |
|1002       |0          |0          |null       |

提前致谢,对不起,纽比。我可以使用 vb 和 msAccess 查询来做到这一点,但需要学习比使用 msAccess 更好的方法。

如果我对你的理解正确的话,你想动态地提供 id。 为此,您需要使用占位符。

sql2 = ("SELECT recordid,project_id, s1, s2, s3
FROM table2 t2
WHERE t2.project_id = %s and s1 = '0' or '1'
ORDER by id, recordid DESC LIMIT 1")

您将部分设置为 as variable as %s 占位符。 然后您需要按顺序构建一个包含变量的列表。 在你的情况下,它似乎只是 id。

 placeholder = [row[1]]

然后你给光标提供语句和占位符列表。

 cursor1.execute(sql,placeholder)

希望对您有所帮助!

------------------------循环查询结果1------------

我不能发表评论,所以我需要这样做。 如果计划或可能进行结构更改,最好使用 pandas,就像你说的,因为数据帧更像字典,你不需要使用索引。

r1 = cursor1.fetchall()
for row in r1:
  sql2 = ("SELECT recordid,project_id, s1, s2, s3
              FROM table2 t2
              WHERE t2.project_id = %s
              ORDER by id, recordid DESC LIMIT 1")
   id = [row[0]]
   cursor2.execute(sql2,id)
   cursor2.commit 
   update = ("UPDATE t1
              set s1 = %s, s2 = %s, s3 = %s 
              where project_id = %s")
   line = cursor2.fetchone()
   upt_data = [line[2],line[3],line[4],line[1],]
   cursor3.execute(update,upt_data)
   cursor3.commit