2

私は長い間答えを探し、次のことをしました:

(1)

query = "SELECT COUNT(*) FROM %s WHERE user_name = %s" % (table_name, username)
result = conn.query(query).result()[0][0]
if result == 0:
    (do something)

(2)

query = "SELECT 1 FROM %s WHERE user_name = %s" %(table_name, username)
result = conn.query(query).result()[0][0]
if result == ' ':
    (do something)

(3)

query = "SELECT EXISTS (SELECT 1 FROM %s WHERE user_name = %s)" %(table_name, username)
result = conn.query(query).result()[0][0]
if result == 't':
    (do something)

しかし、すべてが機能するわけではありません...エラーは常に次のとおりです。

column "Tom" does not exist

本当に存在しないので、存在するか確認したいだけです。どんな助けでも大歓迎です。

4

3 に答える 3

3
sql = """SELECT count(*)
         FROM information_schema.columns
         WHERE table_name = '%s'
         AND column_name = '%s'
      """ % (thetable,thecolumn)
于 2012-10-19T17:38:10.163 に答える
2

文字列を引用していません。

PostgreSQL に到達すると、クエリは次のようになります。

SELECT COUNT(*) FROM Table WHERE user_name = Tom

user_name列を存在しない列と比較しTomます。

必要なのは、次のようなクエリです。

SELECT COUNT(*) FROM Table WHERE user_name = 'Tom'

これを正しく行うには、パラメーター化されたステートメントを使用して、SQL インジェクションの可能性を回避する必要があります。DBAPI モジュールを使用すると、次のように簡単になります。

cursor = conn.cursor()
cursor.execute('SELECT COUNT(*) FROM Table WHERE user_name = %s', user_name)

テーブル名も動的にする必要がある場合は、次のように作成する必要があります。

cursor = conn.cursor()
query = 'SELECT COUNT(*) FROM %s WHERE user_name = %%s' % table_name
cursor.execute(query, user_name)

ただし、テーブル名が有効であることを完全に確認する必要があります。その変数を制御できる人は誰でも、データベースに対して絶対に何でもできます。

于 2012-10-19T17:38:17.643 に答える
1

常に覚えておいてください:EAFP

try:
   result = conn.query(query).result()
except ProgrammingError:  # Edumacated guess based on the documentation
   # however untested so psycopg2 raises some other instead
   pass # or do_something_when_it_does_not_exist()
else:
   (do something)
于 2012-10-19T17:27:11.060 に答える