使用来自 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;
假设我们有一个包含如下付款信息的 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;