使用来自 csv Python 的数据更新 Firebird table

Update Firebird table with data from csv Python

假设我们有一个包含如下付款信息的 CSV 文件:

somthing1:500.00
somthing2:300.00
somthing3:200.00

我需要用 CSV 文件中第二列的值更新 Firebird 数据库中 tableB 中的不同行,该数据库有一个名为 paid 的列。出于这个原因,我创建了一个 全局临时 table 只是为了将数据泵入其中,然后更新所需的 table。我试过的是:

idd = 0
with open('file.csv', 'r', encoding='utf-8', newline='') as file:
    reader = list(csv.reader(file, delimiter=':'))
    for row in reader:
        idd += 1
            c.execute("""INSERT INTO temp_table (id,code,paid) VALUES (?,?,?)""", 
            (idd,str(row[0]),str(row[1]), ))

这按预期工作 - table 已填充。之后我尝试像这样更新其他 table:

c.execute("""select paid from temp_table;""")
res = c.fetchall()
for r in res:
    c.execute(f"""UPDATE tableB SET paid = {r[0]} WHERE oid = 10;""")

这确实有效 - 对于 SELECT 查询的每个结果,它都会使用与下一个结果相同的值更新所有行。我尝试在数据库本身中使用 MERGE 得到相同的结果——每一行都使用来自 temp_table:

的相同值进行更新
MERGE INTO tableB b
USING (SELECT paid FROM temp_table) e
ON b.paid = 0 AND oid = 10
WHEN MATCHED THEN
UPDATE SET b.paid = e.paid;

我需要一些方法来更新 tableB 的第一行和 CSV 的第一行,依此类推。我错过了什么?

问题是您没有将 temp_table 中的行与 tableB 中的行相关联。

在您最初的尝试中,您将 tableB 中的所有行更新为 oid = 10。同样,在您的第二次尝试中,您使用 paid = 0 更新所有行而不关联 temp_table.

您需要添加一个条件来匹配表之间的行,假设它们都有一个 id 列:

MERGE INTO tableB b
USING (SELECT paid FROM temp_table) e
ON b.paid = 0 AND b.oid = 10 AND b.id = e.id
WHEN MATCHED THEN
  UPDATE SET b.paid = e.paid;