본문 바로가기
MySql

MySQL Python MySQldb로 레코드가 있는지 확인하는 방법

by 베이스 공부 2021. 1. 21.
반응형

mysql에 연결하는 파이썬 프로그램을 만들고 있습니다.

성공적으로 연결되었음을 표시하기 위해 테이블에 숫자 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 멍청이입니다. 감사합니다.

 

해결 방법

 

가장 효율적인 "존재합니까"쿼리는 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 () 를 수행하는 방법입니다.

 

참조 페이지 https://stackoverflow.com/questions/13373843

 

 

반응형

댓글