2016-04-01 71 views
1

試圖批量插入使用pymssql這裏CSV文件的代碼:pymssql批量插入錯誤(蟒蛇)

conn = pymssql.connect(host='server', user='user', password='secret', database='My_Dev') 
cur = conn.cursor() 
load = 'BULK INSERT TempStaging FROM \'/home/dross/python/scripts/var/csv/' + f + '.csv\' WITH (FIRSTROW = 1,FIELDTERMINATOR = ',',ROWTERMINATOR = \'\\n\') GO")' 
cur.execute(load) 

當執行得到以下錯誤:

Traceback (most recent call last): 
    File "./uploadResults.py", line 46, in <module> 
    cur.execute(sweepload) 
    File "pymssql.pyx", line 447, in pymssql.Cursor.execute (pymssql.c:7092) 
    File "_mssql.pyx", line 1009, in _mssql.MSSQLConnection.execute_query (_mssql.c:11585) 
    File "_mssql.pyx", line 1040, in _mssql.MSSQLConnection.execute_query (_mssql.c:11459) 
    File "_mssql.pyx", line 1160, in _mssql.MSSQLConnection.format_and_run_query (_mssql.c:12652) 
    File "_mssql.pyx", line 203, in _mssql.ensure_bytes (_mssql.c:2733) 
AttributeError: 'tuple' object has no attribute 'encode' 

46號線是cur.execute線

+1

使用帶有SQL三重引號。 '',',ROWTERMINATOR'不會被轉義 –

+0

@Wayne Werner:使用以下內容: ** load ='BULK INSERT TempStaging FROM \'/ home/dross/python/scripts/var/csv /'+ filename +' .csv \'WITH(FIRSTROW = 1,FIELDTERMINATOR = \',\',ROWTERMINATOR = \'\\ n \')'** 這與您的意思相同嗎?(我是python初學者) – dross

回答

1

請注意,.format()可能允許sql injection,但如果你控制文件名,那麼它不是很糟糕(不知道如果一個參數可以在這裏工作)。

另外,你應該在處理SQL時使用三重引號的字符串,你的生活會好得多。就像這樣:

load = '''BULK INSERT TempStaging FROM /home/dross/python/scripts/var/csv/{}.csv WITH (FIRSTROW=1, FIELDTERMINATOR=',', ROWTERMINATOR='\n')'''.format(filename) 

作爲三聯報價,你也可以打破它,使它更易於閱讀:

load = ''' 
    BULK INSERT TempStaging 
    FROM /home/dross/python/scripts/var/csv/{}.csv 
    WITH (
     FIRSTROW=1 
     , FIELDTERMINATOR=',' 
     , ROWTERMINATOR='\n' 
    ) 
'''.format(filename)