2011-11-28 33 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')和一切工作。

什么。