LOAD是一个DB2实用程序,我想用它将数据从CSV文件插入表中。如何使用ibm_db
驱动程序在Python中执行此操作?我在文档here
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
直接使用db2 CLP(即os.system('db2 -f /path/to/script.file')
)不是一个选项,因为DB2位于我没有SSH访问权限的其他计算机上。
EDIT:
使用ADMIN_CMD
实用程序也不起作用,因为由于防火墙而无法将正在加载的文件放在数据库服务器上。目前,我已切换到使用INSERT
答案 0 :(得分:2)
LOAD
是IBM命令行处理器命令,而不是SQL命令。是这样的,它不能通过ibm_db
模块获得。
执行此操作的最典型方法是将CSV数据加载到Python中(无论是所有行还是批量,如果它对于内存来说太大),然后使用批量插入将多个行一次插入数据库。
要执行批量插入,您可以使用execute_many
method。
答案 1 :(得分:1)
你可以CALL
ADMIN_CMD
程序。 ADMIN_CMD支持LOAD
和IMPORT
。请注意,这两个命令都要求加载/导入的文件位于数据库服务器上。
该示例取自DB2 Knowledge Center:
CALL SYSPROC.ADMIN_CMD('load from staff.del of del replace
keepdictionary into SAMPLE.STAFF statistics use profile
data buffer 8')
答案 2 :(得分:1)
简而言之:一种解决方案是使用 SQLAlchemy adapter 和 Db2’s External Tables。
Engine 是任何 SQLAlchemy 应用程序的起点。它是实际数据库及其 DBAPI 的“大本营”,通过连接池和 Dialect 传递给 SQLAlchemy 应用程序, 描述了如何与特定类型的数据库/DBAPI 组合进行对话。
在上面,Dialect 引用了 Pool 和 create_engine(),它们共同解释了 DBAPI 的模块功能以及数据库的行为。
创建引擎只是发出一个调用的问题,External table options:
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
变量指定的值的信息,请参阅 Engine。
一般示例
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))