반응형

sqlite3 테이블에서 중복값을 찾는  Python 예제코드입니다.



2023. 12. 3  최초작성

2024. 3. 7  에러처리 코드 추가




중복을 검사할 테이블을 생성합니다.

 

import sqlite3



database_file_path = 'zodiac.db' 
table_name = 'zodiac' 


try:
    conn = sqlite3.connect(database_file_path)
    cursor = conn.cursor()
    print("Database connection successful!")
except sqlite3.Error as e:
    print(f"Database connection failed: {e}")
    exit()
cursor = conn.cursor()


query = f'DROP TABLE {table_name}'
try:
    cursor.execute(query)
    print("Table delection successful!")
except sqlite3.Error as e:
    print(f"Table delection failed: {e}")


# 테이블을 생성합니다.
query = f'''
CREATE TABLE IF NOT EXISTS {table_name} (
    year INTEGER PRIMARY KEY,
    animal TEXT
)
'''

try:
    cursor.execute(query)
    print("Table creation successful!")
except sqlite3.Error as e:
    print(f"Table creation failed: {e}")
    conn.close()
    exit()



cursor.execute(f'INSERT INTO {table_name} (year, animal) VALUES (?, ?)', (2000, '용'))
cursor.execute(f'INSERT INTO {table_name} (year, animal) VALUES (?, ?)', (2002, '말'))
cursor.execute(f'INSERT INTO {table_name} (year, animal) VALUES (?, ?)', (2012, '용'))
conn.commit()


query = f'SELECT * FROM {table_name}'
try:
    cursor.execute(query)
   
except sqlite3.Error as e:
    print(f"select execution failed : {e}")

results = cursor.fetchall()


cursor.close()
conn.close()


for result in results:
    print(result)





실행하면 다음처럼 용이 2번 포함되어 있습니다.

 

Database connection successful!

Table delection failed: no such table: zodiac

Table creation successful!

(2000, '용')

(2002, '말')

(2012, '용')




다음 코드를 사용하여 animal 컬럼에 용이 두번 중복된 것을 찾습니다.

 

import sqlite3


database_file_path = 'zodiac.db'  # 데이터베이스 파일 이름입니다.
table_name = 'zodiac'             # 테이블 이름입니다.
column_name = 'animal'            # 중복값을 찾을 컬럼 이름입니다.


try:
    conn = sqlite3.connect(database_file_path)
    cursor = conn.cursor()
    print("Database connection successful!")
except sqlite3.Error as e:
    print(f"Database connection failed: {e}")
    exit()
cursor = conn.cursor()


try:
    cursor.execute(f"""
    SELECT {column_name}, COUNT(*)
    FROM {table_name}
    GROUP BY {column_name}
    HAVING COUNT(*) > 1
    """)
    # 데이터베이스에서 특정 테이블(table_name)의 특정 열(column_name)에 대해 중복된 값을 찾는 쿼리를 실행합니다.
    # 지정된 열에서 중복된 값과 그 값이 테이블에서 나타나는 횟수를 반환합니다.
    #
    # 1. SELECT {column_name}, COUNT(*)  : 선택한 열(column_name)의 값과 해당 값이 테이블에 나타나는 횟수를 선택합니다.
    # 2. FROM {table_name} : 쿼리가 실행될 테이블(`table_name`)을 지정합니다.
    # 3. GROUP BY {column_name} : column_name의 모든 고유 값에 대해 그룹을 만들고, 각 그룹 내에서 해당 값이 나타나는 횟수를 계산합니다.
    # 4. HAVING COUNT(*) > 1 : 그룹화된 결과 중에서 해당 값이 한 번 이상 나타나는 경우만 선택합니다. 즉, 중복된 값을 찾는 데 사용됩니다.


    # 중복된 값이 있는지 결과를 가져옵니다.
    duplicates = cursor.fetchall()

    # 중복된 값이 있으면 출력합니다.
    if duplicates:
        print("중복된 값이 있습니다:")
        for dup in duplicates:
            print(f"값 {dup[0]} 는 {dup[1]}번 중복되었습니다.")
    else:
        print("중복된 값이 없습니다.")

except sqlite3.Error as e:
    print(f"데이터베이스 오류 발생: {e}")

finally:
    conn.close()






실행 결과 용이라는 값이 2번 중복되었다는 것을 출력합니다.



중복된 값이 있습니다:

값 용 는 2번 중복되었습니다.



첫번째 코드를 수정하여 다음 2개의 값만 테이블에 저장하도록 변경해봅니다.

 

(2000, '용')

(2002, '말')




두번째 코드를 사용하여 중복을 검사하면 다음처럼 중복된 값이 없다고 출력됩니다.

 

중복된 값이 없습니다.

 

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts