2011-11-28 69 views
1

我正在使用反映的sqlalchemy映射類到SQL Server表。 I DBSession.add()實例的活動類(映射類)與我從不同的來源獲得的數據。 然後我打電話器transaction.commit()(因爲我從TG2我不能使用session.commit調用())sqlalchemy拋出DataError 22001使用tg2和pyodbc寫入到SQL Server 2005

錯誤回溯:

DataError: (DataError) ('22001', '[22001] [Microsoft][ODBC SQL Server Driver][SQ 
L Server]String or binary data would be truncated. (8152) (SQLExecDirectW); [010 
00] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been termin 
ated. (3621)') u'INSERT INTO [NOAR_LOADEVENTS] ([EVENTCODE]) VALUES (?)' ((u'210 
401',), (u'210402',), (u'210602',), (u'210603',), (u'000010',), (u'000102',), (u 
'000206',), (u'000107',) ... displaying 10 of 49 total bound parameter sets ... 
    (u'211302',), (u'210403',)) 

很高興任何幫助這是因爲我很笨如何繼續/從這裏調試

編輯:我懷疑這與unicode有關,所以我將sqlalchemy列更改爲unicode。

也許DataError以某種方式被卡住,我需要調用一個回退,但我不知道熱,TG2調用回滾事務

編輯:在MSSQL中EVENTCODE列:數據類型:PK,爲nvarchar(6),NOT NULL 希望這有助於

另一個編輯:插入代碼(相關部分)

event = #json with data 
ac['EVENTCODE']=event.get('code')#for example u'210602' - from the failing data 
... 
... 
e = Activities(**ac) # this is the class mapped with sqlalchemy to the NOAR_LOADEVENTS in sqlalchemy. 
DBSession2.add(e) 
transaction.commit() 
+0

什麼是EVENTCODE列的數據類型和大小? – Bryan

+0

@beargle剛剛在編輯中回答 – alonisser

+0

此錯誤「字符串或二進制數據將被截斷。」意味着某些參數值超出列數據類型的長度。你能提供用於生成參數列表並執行插入的代碼嗎? – Bryan

回答

1

解決了。 @beargle評論帶領我在正確的方向。似乎問題勉強是試圖插入長度爲6的nvarchar字段。似乎是一個長度爲6的unicode字符串:u'110110'會在字符串'110110'傳遞正常時產生錯誤。所以我用

variable.encode('utf-8')和一切工作。

什麼。