2

PSQLの引用についてはここでたくさん見つけることができますが、この問題に完全に適合するものはありません。

まず、それは応急修理です。私はそれが応急修理であることを知っていますが、私はそれに固執していると思います(他の選択肢もありますが)

アクセスが制限されているほぼブラックボックスのサードパーティのLinuxアプライアンスがあり、bash、python、psqlを使用できます。psycopg2やその他のpgライブラリはありません。

使用するDBは、引用符で囲む必要のある大文字と小文字を区別するテーブル名を使用します(質問しないでください...)

そのため、現時点では、OSシェルコマンドを記述してデータを取得し、それをいじって必要に応じてJSONに変換します。

簡単な例:

pg_str = "psql -U pword dbname -A -t -c "
sql = "SELECT * FROM \"Addresses\" WHERE id=999"
os_str = pg_str + "\'" + sql + "\'" + ";"
data = string.split(os.popen(os_str).read())

問題ありません。私はそれがきれいだとは主張していませんが、それは機能します(dbライブラリをインポートできないことを忘れないでください...)

テキストフィールドにwhere句があると、すべてうまくいきません。

pg_str = "psql -U pword dbname -A -t -c "
sql = "SELECT * FROM \"Addresses\" WHERE town='london'"
os_str = pg_str + "\'" + sql + "\'" + ";"
data = string.split(os.popen(os_str).read())

引用符の組み合わせが多すぎて対処できません...?

私は明らかに多くのエスケープの組み合わせを試し、数時間グーグルしてきましたが、すべてのソリューションには、アクセスできないライブラリが必要なようです。

私はPythonやpsqlの専門家ではありません-これは私の現在の制限についてです。私はそれについて間違った方向に進んでいると確信していますが、現在、正しい方法を考え出すことに殴られています...

4

2 に答える 2

2
  1. 文字列内の文字を\エスケープする必要はありません。'"
  2. 文字列を使用する"""と、文字をエスケープする必要がなくなり"ます。
  3. string.replace を使用'して、シェルの文字を引用符で囲み、それらを に置き換えます'\'''結果の文字列は、シェルに渡すときにエスケープされていない文字で囲む必要があります。

これらのルールを使用すると、SQL 文字列を読みやすく編集しやすくすることができます。

pg_str = "psql -U pword dbname -A -t -c "
sql = """SELECT * FROM "Addresses" WHERE town='london'"""
sql = sql.replace("'", "'\\''")
os_str = pg_str + "'" + sql + "'" + ";"
data = string.split(os.popen(os_str).read())
于 2012-11-30T01:39:17.797 に答える
2

@qqx が提供したものに加えて、単一引用符の代わりにドル引用符を使用して、簡単にすることができます。

pg_str = "psql -U pword dbname -A -t -c "
sql = """'SELECT * FROM "Addresses" WHERE town = $$london$$'"""
data = string.split(os.popen(pg_str + sql).read())

ところで: 単一の SQL コマンドでは、末尾のセミコロン (;) はオプションです。

于 2012-11-30T01:52:41.440 に答える