mssql 2005 を使用して、別のアプリケーションのデータベースで動作するアプリケーションを構築しています (それを変更したり、既存のテーブル定義を変更したりすることはできません)。w mssqlテーブルの照合は「ヘブライ語のbin」であり、アプリケーションはテーブルから完全なヘブライ語を表示し、すべてのpyファイルはutf-8でエンコードされています
知らせ!mssql を使用して Unicode ヘブライ語文字列をデータベースに書き込むことは問題ありません。選択と削除に問題はありませんがDBSession2.query(object).filter(object.LOADED=='Y').delete()
、テーブルから選択すると、次の非常に厄介なエラーが発生します。
File "D:\Python27\learn\agent\agent\lib\encodings\utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe0 in position 0: invalid continuation byte
ここで、正確なバイト コードは、テーブルの最初の行の最初のバイトに従って変化します。
はい、私はこれがヘブライ文字に変換されることを知っています-すべての側がユニコードで遊んでいるので、これは問題にはなりません.
ところで - これは、テスト用の mssql 2005 サーバーでは正常に機能しましたが、運用サーバーでは機能しません。
いくつかのコード: これは関数の失敗部分です:
def iterateJson(parser,injson,object):
'''iterateJson(parser,injson,object):getting a parser method an a json and iterating over the json
with the parser method, checkes for existing objects in the db table and deletes them before commiting the new one to
prevent integerityerrors
writes ValidateJsonError to errorlog for each element in the json
getting an onject name to check for loaded etc'''
#first lets erase the table from loaded objects
DBSession2.query(object).filter(object.LOADED=='Y').delete()
print "finished deleting loaded"
#now lets get a list from the table of loaded id
raw_list = DBSession2.query(object).all() #the failing part!
print "getting raw list of unloaded" #doesn't get here!
if object == Activities:
id_list = [e.EVENTCODE for e in raw_list]
id = e.EVENTCODE
これは sqlalchemy クラスの一部です:
class Deposit(DeclarativeBase2):
__tablename__ = 'NOAR_LOADDEPOSIT'
#LINE = Column(INT(8))
RECDEBNUM = Column(NVARCHAR(9) , primary_key=True)
CURDATE = Column(BIGINT, nullable=False, default=text(u'((0))'))
PAYTYPE = Column(CHAR(1), nullable=False, default=text(u"('')"))
BANKCODE = Column(NVARCHAR(8), nullable=False, default=text(u"('')"))
CUSTACCNAME = Column(NVARCHAR(16), nullable=False, default=text(u"('')"))
PAGENUM = Column(NVARCHAR(5), nullable=False, default=text(u"('')"))
RECNUM = Column(NVARCHAR(2), nullable=False, default=text(u"('')"))
RECDATE = Column(BIGINT, nullable=False, default=text(u'((0))'))
FIXNUM = Column(NCHAR(1), nullable=False, default=text(u"('')"))
EVENTNUM = Column(NVARCHAR(5), nullable=False, default=text(u"('')"))
GROUPCODE = Column(NVARCHAR(7), nullable=False, default=text(u"('')"))
IDNUMBER = Column(NVARCHAR(9), nullable=False, default=text(u"('')"))
および他のクラス(どちらも同じ問題を引き起こします)
class Activities(DeclarativeBase2):
__tablename__ = 'NOAR_LOADEVENTS'
EVENTCODE = Column(NVARCHAR(8), primary_key=True)
EVENTDES = Column(Unicode, nullable=False, default=text(u"('')"))
TYPE = Column(NCHAR(1), nullable=False, default=text(u"('')"))
LC = Column(NCHAR(1), nullable=False, default=text(u"('')"))
LD = Column(NCHAR(1), nullable=False, default=text(u"('')"))
LE = Column(NCHAR(1), nullable=False, default=text(u"('')"))
LF = Column(NCHAR(1), nullable=False, default=text(u"('')"))
LG = Column(NCHAR(1), nullable=False, default=text(u"('')"))
LH = Column(NCHAR(1), nullable=False, default=text(u"('')"))
使用:pyodbc 2.1.11とmssqlサーバー2005、sqlalchemy 0.7.3 tg2.1.3を使用したpython 2.7(64ビット勝利)
助けや参考になれば幸いです