簡體   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