【问题标题】:Python ->MySQL : UPDATE SET is not updating properlyPython -> MySQL:UPDATE SET 未正确更新
【发布时间】:2021-10-27 23:16:20
【问题描述】:

嗨,我是 sql 新手,我正在寻找一种方法让我循环一个表,以便我可以检查 ItemName 是否已经在保存的第二个表中。 那是我的代码 myresult 和 myresult2 是 SELECT FROM ItemName 的 fetchall() 语句,其中 samevalue 为空,需要更新。

bollean_nodata = False
query = "SELECT nameItem FROM MARCT WHERE samevalue is null;"
mycursor.execute(query)
myresult = mycursor.fetchall()

try: 
    query = "SELECT nameItem FROM ExistingItems;"
    mycursor.execute(query)
    myresult2 = mycursor.fetchall()
except:
    bollean_nodata = True
    print("myresult2 not found making new exisitingItem data")

那部分不工作

if bollean_nodata != True:   
for i in myresult2:
        for i2 in myresult:
            if i == i2:
                query = "SELECT id FROM existingitems WHERE nameItem = %s;"
                data = str(i2[0],)
                data = (data,)
                mycursor.execute(query, data)
                id = mycursor.fetchall()
                query = "UPDATE MARCT SET samevalue = %s WHERE nameItem = %s;"
                i2 = str(i2[0])
                id = str(id[0])
                #Format the id from a string to a int
                real_id = ""
                for char in id:
                    if char == '(' or char == ')' or char == ',':
                        continue
                    else:
                        real_id += char
                real_id = int(real_id)
                data = (real_id, i2,)

                mycursor.execute(query, data)    <--- That part doesent update the table 

当什么都没有的时候,那部分会在其中产生一些价值。没必要。

else:
    query = "INSERT INTO EXISTINGITEMS (nameItem) VALUES (%s);"
    count = 0
    while count != len(list[0]):
        Item = str(list[0][count])
        data = (Item,)
        mycursor.execute(query, data)
        db.commit()
        count += 1

但是第二个 mycursor.execute(query, data) 似乎没有更新表一中的数据。 谁能告诉我我做错了什么?

【问题讨论】:

  • 如果所有数据都在数据库中,那么您可能不需要游标来执行任何操作,并且可以使用单个 UPDATE。如果您可以提供没有程序详细信息的 SQL 问题(带有完整的测试用例、表结构、示例数据和预期结果),那可能会有所帮助。
  • 啊,谢谢。你有这方面的例子吗?
  • 当然。但是我需要更多关于表(CREATE TABLE 语句)的详细信息、一些示例数据以及给定数据的预期结果。在 MySQL 命令行客户端中,每个表的SHOW CREATE TABLE tblname; 将至少提供CREATE TABLE 详细信息。

标签: python mysql sql loops


【解决方案1】:

这是一个基于问题中的详细信息的测试用例。希望我在没有错误的情况下提取了这个。我根据那个细节假设了一些类型。

测试用例在这里:

Working test case

这假设我们正在尝试将一些字符串existingitems.id 内容(同时删除(,) 字符)转换为marct.samevalue(可能的整数类型),所有这些都基于匹配nameItem 值的行,并且仅用于@ 987654326@ 具有samevalue IS NULL 的行。

UPDATE 的详细信息在这里:

UPDATE marct
  JOIN existingitems AS i
    ON i.nameItem = marct.nameItem
   SET marct.samevalue = REGEXP_REPLACE(i.id, '[(,)]', '')
 WHERE marct.samevalue IS NULL
;

初始数据marct

+----------+-----------+
| nameItem | samevalue |
+----------+-----------+
| item1    |      NULL |
| item2    |       123 |
| item3    |      NULL |
| item4    |      NULL |
+----------+-----------+

初始数据existingitems

+----------+---------+
| nameItem | id      |
+----------+---------+
| item1    | (222,5) |
| item2    | (999)   |
| item3    | 111     |
| item5    | (555)   |
+----------+---------+

最终marct内容:

+----------+-----------+
| nameItem | samevalue |
+----------+-----------+
| item1    |      2225 |
| item2    |       123 |
| item3    |       111 |
| item4    |      NULL |
+----------+-----------+

【讨论】:

  • 谢谢你,我很感谢你的帮助,现在可以正常工作了。它告诉我我在 sql 中有很多东西要学,我的头喷气机中没有完全掌握语法。 :)
  • @Berthold 不客气。如果答案是可以接受的,您可以Accept 在上/下投票控件附近打勾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2021-11-03
  • 2018-01-20
  • 2020-04-09
  • 2013-04-02
  • 2017-03-09
相关资源
最近更新 更多