4

によると:http ://www.sqlite.org/draft/lang_keywords.html

SQLite3は、次の場合に期待することを実行します。

select "foo" from bar;

ただし、識別子が存在しない場合:

select "non-existant" from bar;

引用符で囲まれたテキストを文字列として扱うことは(古いバージョンとの互換性のために)フォールバックします。

このような引用符で囲まれた列を使用してクエリを動的に作成しているため、これは問題を引き起こします。後者の動作では、エラーをスローする代わりに意味のない結果が返されます。

私はPythonコードを作成しており、PEP-249 PythonデータベースAPI仕様v2.0モジュールをラップするモジュールを使用しているため、必要に応じてデータベース固有のハックを行うことができます。

私たちのバックエンドデータベースは変更される可能性があります(実際、ローカルテストと本番環境ではある時点でおそらく異なるでしょう)ので、可能であればSQL自体を標準のままにしておきたいと思います。

私ができる方法はありますか:

  • この動作を停止/オフにします
  • これが発生したことを簡単に/確実に検出します(そして、私自身の例外を発生させます)
  • どういうわけかこれを回避します(SQLの「」を非標準の同等のものに置き換えることは、プログラムで安全な方法で簡単に行うことができるとは思いません)
4

2 に答える 2

2

列名の前にテーブル名またはエイリアスが付いている場合、それらを誤って解釈することはできません。

SELECT bar."foo", a."baz" FROM bar, blah AS a

複数のテーブルを処理する場合は、列名の競合を回避するために、とにかくこれを使用する必要がある可能性があります。

于 2013-01-23T15:02:15.260 に答える
1

引用符を使用しないでください[]

sqlite> create table blah (name text);
sqlite> select "something" from blah;
sqlite> select "name" from blah;
sqlite> insert into blah values ('hello');
sqlite> select "something" from blah;
something
sqlite> select "name" from blah;
hello
sqlite> select [something] from blah;
Error: no such column: something
sqlite> select [name] from blah;
hello
sqlite> 

プログラムで恨みを与えることを試みてください:

import re
from itertools import cycle

s = 'select "something" from blah;'
sel, cols, rest = re.match(r'(select)\s+(.*?)\s+(from\s+.*)', s).groups()
cols = re.sub('"', lambda g, I=cycle('[]'): next(I), cols)
print ' '.join( (sel, cols, rest) )
# select [something] from blah;
于 2013-01-23T14:00:14.760 に答える