2

反映されたsqlalchemyマップクラスをSQLServerテーブルに使用しています。別のソースから取得したデータを含むActivitiesクラス(マップされたクラス)のDBSession.add()インスタンス。次に、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',))

ここからこれを続行/デバッグする方法がわからないので、これについての助けを喜んでください

編集:これはユニコードと関係があるのではないかと疑われたので、sqlalchemy列をユニコードに変更しました。

DataErrorが何らかの理由でスタックしていて、ロールバックを呼び出す必要があるかもしれませんが、tg2のトランザクションでロールバックを呼び出すのがホットかどうかはわかりません

編集:mssqlのEVENTCODE列は:datatype:PK、nvarchar(6)であり、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()
4

2 に答える 2

1

解決しました。@beargleのコメントは私を正しい方向に導きました。長さ6のnvarcharフィールドに挿入しようとしたときに問題が発生したようです。u'110110'のような長さ6のUnicode文字列は、文字列'110110'が正常に通過するときにエラーを生成するようです。だから私は使用します

variable.encode('utf-8')とすべてが機能します。

なんでもいい。

于 2011-11-29T17:44:25.853 に答える
1

このエラーに飛びつき、列(DB側)の定義をNVARCHAR(100)からNVARCHAR(200)に変更することで解決しました。

于 2020-11-30T13:29:27.440 に答える