簡體   English   中英

如何通過 python ibm_db 驅動程序使用 DB2 LOAD 實用程序

[英]How to use the DB2 LOAD utility using the python ibm_db driver

LOAD 是一個 DB2 實用程序,我想用它來將數據從 CSV 文件插入到表中。 如何使用ibm_db驅動程序在 Python 中執行此操作? 我在此處的文檔中沒有看到任何內容

CMD: LOAD FROM xyz OF del INSERT INTO FOOBAR

將其作為標准 SQL 運行會按預期失敗: Transaction couldn't be completed: [IBM][CLI Driver][DB2/LINUXX8664] SQL0104N An unexpected token "LOAD FROM xyz OF del" was found following "BEGIN-OF-STATEMENT". Expected tokens may include: "<space>". SQLSTATE=42601 SQLCODE=-104 Transaction couldn't be completed: [IBM][CLI Driver][DB2/LINUXX8664] SQL0104N An unexpected token "LOAD FROM xyz OF del" was found following "BEGIN-OF-STATEMENT". Expected tokens may include: "<space>". SQLSTATE=42601 SQLCODE=-104

直接使用 db2 CLP(即os.system('db2 -f /path/to/script.file') )不是一個選項,因為 DB2 位於我沒有 SSH 訪問權限的另一台機器上。

EDIT:
使用ADMIN_CMD實用程序也不起作用,因為由於防火牆,正在加載的文件無法放在數據庫服務器上。 現在,我已經切換到使用INSERT

LOAD是 IBM 命令行處理器命令,而不是 SQL 命令。 是這樣,它不能通過ibm_db模塊使用。

執行此操作的最典型方法是將 CSV 數據加載到 Python(所有行或批處理,如果內存太大),然后使用批量插入將多行一次插入到數據庫中。

要執行批量插入,您可以使用execute_many方法

您可以CALL ADMIN_CMD過程。 ADMIN_CMD支持LOADIMPORT 請注意,這兩個命令都要求加載/導入的文件位於數據庫服務器上。

該示例取自DB2 知識中心

CALL SYSPROC.ADMIN_CMD('load from staff.del of del replace
 keepdictionary into SAMPLE.STAFF statistics use profile
 data buffer 8')

使用 Python 將 CSV 轉換為 DB2

簡而言之:一種解決方案是使用SQLAlchemy適配器Db2 的 External Tables

SQLAlchemy:

引擎是任何 SQLAlchemy 應用程序的起點。 它是實際數據庫及其 DBAPI 的“大本營”,通過連接池和Dialect傳遞給 SQLAlchemy 應用程序,它描述了如何與特定類型的數據庫/DBAPI 組合進行對話。

在此處輸入圖片說明

在上面的地方,一個Engine引用了一個Dialect和一個Pool ,它們一起解釋了 DBAPI 的模塊功能以及數據庫的行為。

創建引擎只是發出一個調用create_engine() 的問題

dialect+driver://username:password@host:port/database

其中 dialect 是數據庫名稱,例如 mysql、oracle、postgresql 等,driver 是 DBAPI 的名稱,例如 psycopg2、pyodbc、cx_oracle 等。

使用臨時外部表加載數據:

瞬態外部表 (TET) 提供了一種定義僅在單個查詢期間存在的外部表的方法。

TET 具有與普通外部表相同的功能和限制。 TET 的一個特殊功能是,當您使用 TET 將數據加載到表中或創建 TET 作為 SELECT 語句的目標時,您不需要定義表架構。

以下是 TET 的語法:

INSERT INTO <table> SELECT <column_list | *>
FROM EXTERNAL 'filename' [(table_schema_definition)]
[USING (external_table_options)];

CREATE EXTERNAL TABLE 'filename' [USING (external_table_options)]
AS select_statement;

SELECT <column_list | *> FROM EXTERNAL 'filename' (table_schema_definition)
[USING (external_table_options)];

有關可以為external_table_options變量指定的值的信息,請參閱外部表選項

一般示例

  • 通過發出以下命令,將臨時外部表中的數據插入到 Db2 服務器上的數據庫表中:
INSERT INTO EMPLOYEE SELECT * FROM external '/tmp/employee.dat' USING (delimiter ',' MAXERRORS 10 SOCKETBUFSIZE 30000 REMOTESOURCE 'JDBC' LOGDIR '/logs' )

要求

pip install ibm-db
pip install SQLAlchemy

派頓代碼

下面的一個例子展示了它是如何協同工作的。

from sqlalchemy import create_engine


usr = "enter_username"
pwd = "enter_password"
hst = "enter_host"
prt = "enter_port"
db = "enter_db_name"

#SQL Alchemy URL
conn_params = "db2+ibm_db://{0}:{1}@{2}:{3}/{4}".format(usr, pwd, hst, prt, db)

shema = "enter_name_restore_shema"
table = "enter_name_restore_table"
destination = "/path/to/csv/file_name.csv"

try:
    print("Connecting to DB...")
    engine = create_engine(conn_params)
    engine.connect()  # optional, output: DB2/linux...
    print("Successfully Connected!")
except Exception as e:
    print("Unable to connect to the server.")
    print(str(e))

external = """INSERT INTO {0}.{1} SELECT * FROM EXTERNAL '{2}' USING (CCSID 1208 DELIMITER ',' REMOTESOURCE LZ4 NOLOG TRUE )""".format(
    shema, table, destination
)

try:
    print("Restoring data to the server...")
    engine.execute(external)
    print("Data restored successfully.")
except Exception as e:
    print("Unable to restore.")
    print(str(e))

結論

  • 恢復大文件的一個很好的解決方案,特別是 600m 工作沒有任何問題。
  • 它對於將數據從一個表/數據庫復制到另一個表也很有用。 以便備份作為 csv 的導出完成,然后使用給定的示例將該 csv 導出到 DB2。
  • SQLAlchemy- Engine可以與其他數據庫結合,例如:sqlite、mysql、postgresql、oracle、mssql 等。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM