2016-05-09 7 views
1

PyCharmのPostgreSQL方言に問題があります。私は以下のSELECTクエリがある:PyCharm PostgreSQLの方言検出

"SELECT * FROM table WHERE ST_DWithin(table.geog_column, 
ST_GeographyFromText(\'SRID=4326;POINT(%s %s)\'), %s)" 

クエリはクエリエディタで期待どおりに実行しますが、Pycharmが<expression> expected, got '%'を文句を言います。私はPostgreSQLに方言の検出を設定しました。

私はパラメータバインディングに問題があると思われますが、問題の内容を把握することはできません。どんな助けもありがとう。

答えて

2

EDIT:私は何とか、pythonの文字列の補間と連結の使用に関するpsycopg2のドキュメントに関する明確な警告を見逃していました。

それを行うための正しい方法は、生のSQLクエリを構築するためにSQLAlchemyのを使用することです:

from sqlalchemy import text 

sql = text("SELECT * FROM table WHERE ST_DWithin(table.geog_column, 
ST_GeographyFromText(\'SRID=4326;POINT(:long :lat)\'), :distance)") 
data = {'long': longitude, 'lat': latitude, 'distance': distance} 
result = conn.execute(sql, data) 

以下のアプローチが間違っているとSQLインジェクションの影響を受けやすいです。私は参考のためにここに残しました。

私は間違いを見つけました。カフェインが飢えている他の人は、%sを一重引用符で囲む必要があります。初心者ですが簡単に逃すことができます。

"SELECT * FROM table WHERE ST_DWithin(table.geog_column, 
ST_GeographyFromText(\'SRID=4326;POINT('%s' '%s')\'), *'%s'*)" 

引用符は私のために問題を修正しましたが、私は、これは正しいアプローチであるため、いくつかの入力を取得するには、ここでそれを残している場合、完全にわかりません。