2 votes

sqlalchemy jette une DataError 22001 en utilisant tg2 et pyodbc pour écrire dans SQL Server 2005

J'utilise une classe mappée sqlalchemy reflétée dans une table SQL Server. J'ai DBSession.add() instances de la classe Activities (la classe mappée) avec des données que j'obtiens d'une source différente. et ensuite j'ai appelé transaction.commit() (puisque j'appelle depuis tg2 je ne peux pas utiliser session.commit())

la trace de l'erreur :

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',))

Je serais heureux d'avoir de l'aide à ce sujet car je ne sais pas comment continuer/déboguer à partir d'ici.

edit : Je soupçonne que cela a quelque chose à voir avec l'unicode, j'ai donc changé la colonne sqlalchemy en unicode.

peut-être que le DataError est bloqué d'une manière ou d'une autre et que je dois appeler un retour en arrière, mais je ne sais pas comment appeler un retour en arrière dans une transaction dans tg2.

modifier :la colonne EVENTCODE dans le mssql est:datatype:PK,nvarchar(6), not null J'espère que cela vous aidera

autre montage : le code d'insertion (la partie concernée)

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

1voto

alonisser Points 2257

Résolu. Le commentaire de @beargle m'a conduit dans la bonne direction. Il semble que le problème, étrangement, était d'essayer d'insérer un champ nvarchar avec une longueur de 6. Il semble qu'une chaîne unicode avec une longueur de 6 comme : u'110110' produirait une erreur alors qu'une chaîne '110110' passe très bien.

variable.encode('utf-8') et tout fonctionne.

ou quoi que ce soit.

1voto

manuzambo Points 146

J'ai rencontré cette erreur et je l'ai résolue en modifiant la définition d'une colonne (côté DB) de NVARCHAR(100) à NVARCHAR(200).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X