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
纽比从事我的第一个项目。抱歉这个解释。
我有 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