sqlalchemy使用tg2和pyodbc写入SQL Server 2005时抛出DataError 22001



我使用一个反射的sqlalchemy映射类到SQL Server表中。I DBSession.add() Activities类(映射类)的实例,其中包含从不同来源获得的数据。然后我调用transaction.commit()(因为我是从tg2调用的,所以我不能使用session.commit())

错误回溯:

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中调用事务回滚

edit: mssql中的EVENTCODE列为:datatype:PK,nvarchar(6),不为空希望能有所帮助

另一个编辑:插入代码(相关部分)

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()

已解决。@beargle的评论给我指明了正确的方向。似乎这个问题很奇怪,试图插入到长度为6的nvarchar字段。看起来像:u'110110'这样长度为6的unicode字符串会产生错误,而字符串'110110'则可以通过。所以我用

variable.encode('utf-8'),一切正常

我跳进这个错误,我通过改变列(DB侧)的定义从NVARCHAR(100)到NVARCHAR(200)来解决它。

最新更新