从Python数据框架向DB2表中插入数据

3

我正在使用Python库IBM_DB,能够建立连接并将表读入数据帧中。

当从Python的数据帧源写入到DB2表(插入查询)时,问题就出现了。

下面是用于连接的示例代码,但有人能帮助我如何将数据帧中的所有记录插入到DB2目标表中吗?

import pandas as pd
import ibm_db
ibm_db_conn = ibm_db.connect("DATABASE="+"database_name"+";HOSTNAME="+"localhost"+";PORT="+"50000"+";PROTOCOL=TCPIP;UID="+"db2user"+";PWD="+"password@123"+";", "","")
import ibm_db_dbi
conn = ibm_db_dbi.Connection(ibm_db_conn)

df=pd.read_sql("SELECT * FROM SCHEMA1.TEST_TABLE",conn)
print df

如果给出带有硬编码值的SQL语法,我也可以手动插入记录:

query = "INSERT INTO SCHEMA1.TEST_TABLE (Col1, Col2, Col3) VALUES('A', 'B', 0)"
print query
stmt = ibm_db.exec_immediate(ibm_db_conn, query)
print stmt

我无法做到的是从DataFrame中插入数据并将其附加到表中。我尝试过DATAFRAME.to_SQL(),但出现以下错误:

df.to_sql(name='TEST_TABLE', con=conn, flavor=None, schema='SCHEMA1', if_exists='append', index=True, index_label=None, chunksize=None, dtype=None)

这个错误提示如下:
pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ibm_db_dbi::ProgrammingError: SQLNumResultCols failed: [IBM][CLI Driver][DB2/LINUXX8664] SQL0204N  "SCHEMA1.SQLITE_MASTER" is an undefined name.  SQLSTATE=42704 SQLCODE=-204

错误提示你在名为SCHEMA1的模式中没有名为sqlite_master的表。找到正确的模式名称或正确的表名称并使用它。 - mao
我遇到了同样的问题。我知道这是一个旧帖子,但你解决了吗?从我目前在pandas文档中看到的,你应该用“Tablename”和Conn替换name=“Tablename”和con=conn。@ShankarPandey - danielo
有人解决了上面的错误吗? - Dipas
1个回答

7
您可以使用ibm_db.execute_many()将pandas数据框写入IBM DB2数据库。
subset = df[['col1','col2', 'col3']]

tuple_of_tuples = tuple([tuple(x) for x in subset.values])

sql = "INSERT INTO Schema.Table VALUES(?,?,?)"

cnn = ibm_db.connect("DATABASE=database;HOSTNAME=127.0.0.1;PORT=50000;PROTOCOL=TCPIP;UID=username;PWD=password;", "", "")

stmt = ibm_db.prepare(cnn, sql)

ibm_db.execute_many(stmt, tuple_of_tuples)

这行不通,OP正在使用ibm_db_dbi而不是ibm_db来创建连接。 - d0dulk0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接