Django、unixODBC、FreeTDS、Apache2、mod_wsgi について質問があります。これは、以前に SO で尋ねられたこの質問と似ています。
最新の Django、つまり 1.2.3 で実行するように構築された Django Web サイトがあります。ほとんどの場合、管理されたモデルを使用します。セッション情報を除いて、Django によって DB には何も書き込まれず、DB から読み取られるだけです。
問題の DB は、MSSQL 2005 の Windows マシンでホストされています。
Django プロジェクトは Linux マシンでホストされています。これは、Apache2 の mod_wsgi を介して提供されます。DB 接続は、悪名高い FreeTDS と unixODBC のデュオを介して行われます。FreeTDS と unixODBC の両方の最新バージョンが実行されています。Python 側では、pyodbc と django-pyodbc が DB に使用されます。
プロジェクトは、ロード バランサーの背後にある同一の設定で、2 つの Linux ライブ サーバーにデプロイされます。両方が接続する 1 つの DB サーバーがあります。
稼働中の本番サーバーでは、断続的な問題がいくつか発生します。表示するレコードを取得するために DB にクエリを実行するページでは、次のエラーとともに例外がスローされることがあります。
('IM001', '[IM001] [unixODBC][Driver Manager]Driver does not support this function (0) (SQLColAttribute)')
この難問の奇妙な点の 1 つは、このエラーが発生するたびに、Web ブラウザーで更新を押すだけでエラーがクリアされ、DB からフェッチされたレコードでページがレンダリングされることです。
エラーが発生したときにデバッグ出力から生成される SQL は非常に単純です。
SELECT COUNT(*) FROM [TABLE] WHERE ([TABLE].[category] = 5 AND [TABLE].[newRelease] = 1 )
もちろん、Django 開発サーバーでは、これは表示されません。mod_wsgi をデーモン モードで実行している開発マシンで、このエラーに何度も遭遇しました。mod_python にデプロイしてテストしましたが、エラーは見られませんでした。次に、埋め込みモードで mod_wsgi をテストしましたが、ここでもエラーは見られませんでした。組み込みモードで mod_wsgi を使用するようにライブ サーバーの設定を変更したと思いますが、それでもエラーが発生することがあります。
私は本当にこれで立ち往生しています。問題の真の原因を突き止めるために何をすべきかわかりません。役立つ情報をすべて提供したかどうかはわかりません。私がしていない場合は、指摘してください。質問を更新します。
コードに何か問題があり、これを引き起こしているとは思いません。その場合、ほとんどまたは常に機能しません。ライブサーバーで.pycファイルのクリア、Apacheの再起動などを試みましたが、役に立ちませんでした。
どんな助けでも大歓迎です。
ありがとう。
更新:「never_cache」デコレータをほとんどのビュー関数に追加しました。おそらく、Django が行う小さなモデルレベルのキャッシングをオフにできることを期待しています。しかし、それはライブサーバーでは実際には何もしませんでした. 私は今、本当にアイデアがありません。
更新 #2sql_sever/pyodbc/base.py
:例外が生成されたコードの周り (django-pyodbc)内にいくつかのログを記録しました。そして、どうやらとらえどころのないエラーが生成された SQL クエリが他にもあります。
sql = SELECT * FROM (SELECT [TABLE].[id], [TABLE].[productID], [TABLE].[title], [TABLE].[price], [TABLE].[rrp], [TABLE].[saving], [TABLE].[hmvPoints], [TABLE].[availability], [TABLE].[shipping], [TABLE].[rating], [TABLE].[thumbnail], [TABLE].[details], [TABLE].[images], [TABLE].[certImage], [TABLE].[trackListing], [TABLE].[category], [TABLE].[subCategory], [TABLE].[genreId], [TABLE].[bestSeller], [TABLE].[preOrder], [TABLE].[newRelease], (ROW_NUMBER() OVER (ORDER BY [TABLE].[id] ASC)) AS [rn] FROM [TABLE] WHERE [TABLE].[productID] = ? ) AS X WHERE X.rn BETWEEN 1 AND 21
params = (799742,)
exception = ('IM001', '[IM001] [unixODBC][Driver Manager]Driver does not support this function (0) (SQLColAttribute)')
sql = SELECT * FROM (SELECT (1) AS [a], (ROW_NUMBER() OVER (ORDER BY RAND() )) AS [rn] FROM [django_session] WHERE [django_session].[session_key] = ? ) AS X WHERE X.rn BETWEEN 1 AND 1
params = ('e4b669b40d10c336d62c8435198bf1db',)
exception = ('IM001', '[IM001] [unixODBC][Driver Manager]Driver does not support this function (0) (SQLColAttribute)')