5

以下を使用して、DjangoデータをMS SQLServer2005に保存しようとしています。

http://code.google.com/p/django-pyodbc/(pyodbc + FreeTDS)

文字列をASCII文字で構成している限り、すべて問題ありません。ユニコード(例:'\ xc5 \ x82')を使用している場合、djangoはProgrammingErrorを次の場所にスローします。

ProgrammingError at /admin/cli/punktrejestracji/add/
('42000', '[42000] [FreeTDS][SQL Server]The incoming tabular data stream (TDS) protocol stream is incorrect. The stream ended unexpectedly. (4002) (SQLExecDirectW)')

トレースの最後の要素は次のとおりです。

params  ('\xc5\x82',)
self    <django.db.backends.sql_server.pyodbc.base.CursorWrapper object at 0x92ef8ec>
sql 'SELECT (1) AS [a] FROM [cli_punktrejestracji] WHERE [cli_punktrejestracji].[adres] = ? '

ところで、 http: //code.google.com/p/django-mssql/はLinuxでは機能しないようです。django-mssqlにはpythoncomライブラリが必要です。私は正しいですか?

4

3 に答える 3

2

SQLServer2005でDjangoを使用しています。同じ問題が見つかりました。

どのODBCドライバーを使用していますか?FreeTDS?

ユニコードが機能するときに上記のエラー(およびその他)をスローしない、Linux / UNIX用の適切なODBCドライバーを見つけようとしましたが、惨めに失敗しました。私たちがテストしたドライバーはどれも(少なくとも3つ、必要に応じて名前を掘り下げることができます)、django-pyodbcを介してUnicode文字列を処理することに成功しませんでした。

悲しいことに、私たちがやったことは、Windowsサーバー(Apache + mod_wsgi)でDjangoを実行し、MicrosoftのSQLネイティブODBCドライバーを使用することを決定することでした。

それを行うと、ユニコードに関しては問題なく機能します。

于 2010-02-03T18:20:34.780 に答える
1

OK、解決策が見つかりました。freetds.confファイルには

client charset = UTF-8

そしてそれはそれがそうであるべきであるように正確に働きます。

于 2010-02-03T18:23:50.547 に答える
0

受け入れられた応答に加えて、settings.pyでこのエラーを直接修正することができます。

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'MyTableName',
        'HOST': r'server.lan\server_instance_name',
        'USER': 'sa',
        'PASSWORD': 'P@SsW0Rd',
        'OPTIONS': {
            'host_is_server': True,
            "extra_params":"TDS_Version=8.0;ClientCharset=UTF-8",
            "autocommit": True,
            "driver_needs_utf8":True,
        },

     }
}

を見てくださいextra_params

これはグローバルなfreetds.confファイルに依存しないので、より良いです

于 2015-03-02T15:41:28.973 に答える