13

mysqlに接続するPythonプログラムを作成しています。

テーブルに番号1が含まれているかどうかを確認して、正常に接続されたことを示す必要があります。これは、これまでの私のコードです。

xcnx.execute('CREATE TABLE settings(status INT(1) NOT NULL)')
  xcnx.execute('INSERT INTO settings(status) VALUES(1)')
  cnx.commit()
  sqlq = "SELECT * FROM settings WHERE status = '1'"
  xcnx.execute(sqlq)
  results = xcnx.fetchall()
  if results =='1':
    print 'yep its connected'
  else:
    print 'nope not connected'

私は何を逃しましたか?私はSQL初心者です、みんなありがとう。

4

4 に答える 4

21

最も効率的な「存在するか」クエリは、次のことを行うだけだと思いますcount

sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
    # exists

フィールドまたは行に対してカウント操作を実行するようにデータベースに要求する代わりに、結果が一致した場合に 1 または 0 を返すようにデータベースに要求するだけです。これは、実際のレコードを返し、クライアント側で量をカウントするよりもはるかに効率的です。これは、両側でのシリアライゼーションとデシリアライゼーション、およびデータ転送を節約できるためです。

In [22]: c.execute("select count(1) from settings where status = 1")
Out[22]: 1L  # rows

In [23]: c.fetchone()[0]
Out[23]: 1L  # count found a match

In [24]: c.execute("select count(1) from settings where status = 2")
Out[24]: 1L  # rows

In [25]: c.fetchone()[0]
Out[25]: 0L  # count did not find a match

count(*)と同じになりcount(1)ます。あなたの場合、新しいテーブルを作成しているため、1 つの結果が表示されます。10,000 件の一致がある場合、それは 10000 になります。ただし、テストで気にするのは、それが 0 でないかどうかだけなので、bool の真偽テストを実行できます。

アップデート

実際には、行数だけを使用し、結果を取得することさえしない方が高速です。

In [15]: if c.execute("select (1) from settings where status = 1 limit 1"): 
            print True
True

In [16]: if c.execute("select (1) from settings where status = 10 limit 1"): 
            print True

In [17]: 

これは、django の ORM がqueryObject.exists().

于 2012-11-14T06:21:35.073 に答える
3

接続が正常に確立されたかどうかを確認するだけなら、なぜテーブルを作成し、行を挿入し、そこからデータを取得しようとしているのでしょうか?

あなたは単に次のことを行うことができます...

sqlq = "SELECT * FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
results = xcnx.fetchone()
if results =='1':
  print 'yep its connected'
else:
  print 'nope not connected'

実際、プログラムがこれまで例外をスローしていない場合は、接続が正常に確立されたことを示しています。(上記のコードを確認してください。この場合、fetchone がタプル、文字列、または int を返すかどうかはわかりません)。

ところで、何らかの理由でテーブルを作成する必要がある場合は、終了する前に削除して、プログラムが 2 回目に正常に実行されるようにすることをお勧めします。

于 2012-11-14T13:49:40.840 に答える
1

を実行するresults = xcnx.fetchall()と、行の値を含むタプルのシーケンスが戻り値になります。したがって、 if をチェックするときresults == '1'は、シーケンスを定数と比較しようとしているため、 が返されFalseます。あなたの場合、単一行の値0が返されるので、これを試すことができます:

results = xcnx.fetchall()
# Get the value of the returned row, which will be 0 with a non-match
if results[0][0]:
  print 'yep its connected'
else:
  print 'nope not connected'

DictCursor代わりに(カーソルを作成するときは を使用) を使用することもできます。.cursor(MySQLdb.cursors.DictCursorこれにより、コードの解釈が少し簡単になりますが、結果は同じです。

if results[0]['COUNT(*)]':
    # Continues...

また、この場合は大したことではありませんが、整数値を文字列と比較しています。SELECT COUNT(*) FROM settings WHERE status = 1MySQL は型変換を行いますが、(非常に小さな) 少しの処理を使用して節約することができます。

于 2012-11-14T06:11:45.297 に答える