2013-05-15 106 views
1

嘗試使用python 2.4.3將^分隔文件導入DB2數據庫時出現以下錯誤。從python腳本將文件導入DB2時出錯

錯誤:

Traceback (most recent call last): 
    File "C:\Python25\Usefulscripts\order.py", line 89, in <module> 
    load_order_stack() 
    File "C:\Python25\Usefulscripts\order.py", line 75, in load_order_stack 
    conn2.execute(importTmp) 
ProgrammingError: ('42601', '[42601] [IBM][CLI Driver][DB2/LINUXX8664] SQL0104N An unexpected token "orders_extract" 

was found following "import from ".

代碼:

import pyodbc 

def load_order_stack(): 
    try: 
     conn2 = pyodbc.connect('DSN=db2Database;UID=ueserid;PWD=password') 
     importTmp = ("import from orders_extract of del modified by coldel0x5E" 
        "insert_update into test.ORDERS_Table (ORDER_ID,item,price);") 
     conn2.execute(importTmp) 
     conn2.commit() 
+0

請告訴我們你做了什麼,你認爲是什麼問題。當你向他們展示解決問題的工作時,人們更樂意提供幫助,而不僅僅是向他們投擲工作:)。 –

+0

嘗試將文件名與單引號之間的完整路徑。文件是否存在於數據庫服務器上? –

+0

嗨Puciek,是的,我嘗試以各種方式加載文件 - 包括帶有轉義字符的引號,以及完全合格的路徑,但得到了相同的錯誤 – user2385306

回答

2

IMPORT不是一個SQL語句。它是DB2命令行處理器(CLP)命令,因此只能由所述CLP運行。

有通過調用該ADMIN_CMD()存儲過程中的SQL接口,一些CLP命令,請檢查手冊:IMPORT using ADMIN_CMD

+0

我可以通過使用下面的「ADMIN_CMD」命令來擺脫原始錯誤。但是,現在得到一個不同的錯誤 - >「錯誤:('','[] [IBM] [CLI Driver] [DB2/LINUXX8664] SQL3030C I/O錯誤(reason =」sqlofopn -2029060079「)輸入文件。\ r \ n(-3030)(SQLExecDirectW)')「 – user2385306

+0

顯然,DB2無法打開該文件。我希望你意識到你從中導入的文件必須駐留在數據庫服務器上,並且應該由實例所有者用戶讀取。 – mustaccio

+0

是否有另一種方法可以導入我的應用程序服務器上存在的文件(python腳本所在的位置)與數據庫服務器不同?我無權訪問數據庫服務器文件系統 – user2385306

0

此外,還可以讀取該文件,一行一行,並插入選項你的數據庫。這肯定比任何本地導入操作都要慢。假設你分隔的文件結構,文件被命名爲input.txt

ORDER_ID^item^price 
1^'bat'^50.00 
2^'ball'^25.00 

代碼:

import csv 
import pyodbc 

connection = pyodbc.connect('DSN=db2Database;UID=ueserid;PWD=password') 
cursor = connection.cursor() 

with open('input.txt', 'rb') as f: 
    rows = csv.reader(f, delimiter='^') 
    # get column names from header in first line 
    columns = ','.join(next(rows)) 
    for row in rows: 
     # build sql with placeholders for insert 
     placeholders = ','.join('?' * len(row)) 
     sql = 'insert into ({}) values ({});'.format(columns, placeholders) 

     # execute parameterized database insert 
     cursor.execute(sql, row) 
     cursor.commit() 

commit()放置玩,你可能要分批致力於提高性能。