繁体   English   中英

从 Python 笔记本更新 IBM DB2 云中的表

[英]Update Table in IBM DB2 Cloud from Python notebook

我需要使用 Python Notebook 中存储在 dataframe 中的值更新 IBM DB2 云中的列。 我能够从 Python 笔记本连接到 DB2。 现在我需要使用存储在数据框中的值更新 DB2 云中的一列表。 下面是我的代码,问题是我在 df 中有 100 条记录,同样必须在表中更新,但是使用此代码,表中更新了 10000 条记录,这意味着 100*100。 寻求支持

tuple_of_tuples = tuple([tuple(x) for x in df.values])
load_db2_sql = "UPDATE schema.tablename SET Columnname = ?"
stmt = ibm_db.prepare(conn, load_db2_sql)
ibm_db.execute_many(stmt, tuple_of_tuples)

经过几次失败的尝试后,我想出了一种不同的思维方式来解决您面临的问题。

简单的答案:使用 pandas read_sql()方法将您的表读入 dataframe,并用您的新值替换收到的表列值,并使用命令to_sql()更新。

例子:

假设下面是您的 SQL 表,名为dummy_test ,架构名为TEST_SCHEMA

# library versions
pandas 1.0.5
sqlachemy 1.3.17
A    B     C
  1   10   100
  2   20   200
  3   30   300
  4   40   400
  5   50   500
  6   60   600
  7   70   700
  8   80   800
  9   90   900
 10  100  1000
  1. 将此表读入 pandas dataframe
# define execution engine using sqlalchemy create_engine() 
# method with your db params

engine = sqlalchemy.create_engine('ibm_db_sa://{user}:{pwd}@{host}:{port}/{db};SECURITY=SSL'.format(
    user=params['username'],
    pwd=params['password'],
    host=params['hostname'],
    port=params['port'],
    db=params['database']
))
db_table = pd.read_sql('SELECT * FROM TEST_SCHEMA.dummy_test', engine)
# show table output
db_table
    a   b   c
0   1   10  100
1   2   20  200
2   3   30  300
3   4   40  400
4   5   50  500
5   6   60  600
6   7   70  700
7   8   80  800
8   9   90  900
9   10  100 1000
  1. 现在假设 dataframe 您要使用的值被命名为df_with_values_to_update并且列名是A包含您要更新的以下值
df_with_values_to_update
    A
0   10
1   11
2   12
3   13
4   14
5   15
6   16
7   17
8   18
9   19
  1. db_table列 'A' 值替换df_with_values_to_update列 'A' 值
db_table['a'] = df_with_values_to_update['A']
  1. 使用to_sql()方法写回 db2
db_table.to_sql('dummy_test', engine, schema='TEST_SCHEMA', if_exists='replace', index=False)

您可以从第 2 步再次查询 db2 以确认值已被替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM