1

sqlite3 クエリを実行する python (2.7) スクリプトを作成しています。Windowsコンピューターでこのクエリをテストしていますが、魅力的に機能します。Linux をオンにすると、クエリが失敗します。エラーが発生します:そのような列が見つかりません...(つまり、tableA.IDが明らかに存在し、タイプミスはありません)

クエリは基本的に、フラット テーブルを作成する一連の左結合です。

形式は次のとおりです。

 select tableA.fieldA,tableA.fieldB, tableB.fieldC etc... 
 from ((tableA LEFT JOIN tableB on tableA.ID = tableB.FID) LEFT JOIN tableC on tableA.ID = tableC.FID) etc...

この種のクエリは Windows では機能しますが、次のように Linux でブラケットを削除しない限り、Linux ではそのエラーで失敗します。

 select tableA.fieldA,tableA.fieldB, tableB.fieldC etc... 
 from tableA LEFT JOIN tableB on tableA.ID = tableB.FID LEFT JOIN tableC on tableA.ID = tableC.FID etc...

この場合、エラーは発生せず、クエリが実行されます。オペレーティングシステム以外の2つのシステムの唯一の違いは次のとおりです。

 (from python)
 >>>import sqlite3
 >>>sqlite3.sqlite_version 
 '3.5.7' (this is on linux)
 >>>sqlite3.sqlite_version 
 '3.6.21' (this is on windows)

これらの 2 つのバージョンの違いと、Linux でコードを機能させるにはどうすればよいですか (括弧を使用する可能性があります)。ブラケットを使用しないクエリの結果が信頼できるかどうか、およびブラケットを使用したクエリの結果と同じかどうかを判断するのは非常に困難です。これは、膨大な量のデータであり、すべてが正常であることを確認する前に長いテストが必要になるためです。

編集: LEFT JOIN はブラケットなしでどのように機能しますか? 最初に左のほとんどのテーブルに参加し、次に残りのテーブルに参加しますか? クエリがブラケットなしで同じように動作すると確信している場合は、それを実行できます。左端の結合を左端から右端にグループ化しています。つまり、(((((AB)C)D)E)F)

4

1 に答える 1

0

Linux と Windows が同じバージョンを実行するように、最初に 2 つのプラットフォームで sqlite3 を調和させることをお勧めします。これを書いている時点 (2012 年 4 月 30 日) の現在のバージョンは 3.7.11 です。ダウンロードはhttp://www.sqlite.org/download.html から入手できます。

余談ですが、Linux ディストリビューションのリポジトリから入手したコードのバージョンは一般的に古い傾向があるため、ソフトウェアの Web サイトから直接ダウンロードすることをお勧めします。

于 2012-04-30T16:22:07.970 に答える