Python 표준 라이브러리에는 뛰어난 데이터베이스 지원 기능이 내장되어 있어서 Django ORM과 같은 외부 프레임워크에 의존하지 않고도 데이터베이스를 만들고 상호 작용할 수 있습니다. SQLite는 가볍고 Python과 쉽게 통합할 수 있습니다. 간단한 사용자 등록 앱을 사용하여 Python에서 데이터베이스 프로그래밍의 기본 원칙을 소개합니다.
※ 이 글은 아래 기사 내용을 토대로 작성되었습니다만, 필자의 개인 의견이나 추가 자료들이 다수 포함되어 있습니다.
- 원문: How to Create a Registration App With Python and a Database
- URL: https://www.makeuseof.com/python-database-registration-app-how-create/
Python에서 데이터베이스를 만드는 방법
Python에서 데이터베이스(이하 DB)를 생성하고 상호 작용하려면 '연결'과 '커서'라는 두 가지 주요 항목이 필요합니다. 연결은 기존 DB에 연결하거나 새 DB를 만드는 데 도움이 됩니다. SQLite를 사용하여 Python에서 DB 연결을 만드는 방법은 다음과 같습니다.
import sqlite3
# Connect to a (new) database
conn = sqlite3.connect('path/to/database.db')
# Close the connection
conn.close()
connect 메서드는 기존 DB에 대한 경로를 사용합니다. 지정된 경로에 DB가 없으면 데이터베이스를 생성합니다. DB와의 상호작용이 끝나면 데이터베이스 연결을 닫아야 합니다.
커서는 연결된 DB와 상호 작용하는 데 도움이 됩니다. 커서를 사용하여 Python 프로그램 내에서 SQL 쿼리를 실행합니다. 커서를 만드는 방법은 다음과 같습니다.
cursor = conn.cursor()
# Close the cursor
cursor.close()
열려 있는 연결 객체에 대해 cursor 메서드를 호출하여 커서를 만들 수 있습니다.
Python에서 데이터베이스 트랜잭션 실행하기
커서를 사용하면 SQL 문, 쿼리 또는 스크립트를 실행하여 데이터를 읽거나 쓰거나 DB 구조를 변경할 수 있습니다. DB 트랜잭션을 실행하는 데 사용할 수 있는 세 가지 주요 방법이 있습니다.
1. cursor.execute
이 방법은 단일 SQL 문을 실행하며, 사용 방법은 다음과 같습니다. 이 코드는 커서의 실행 메소드를 호출하여 SQL 문이 포함된 문자열을 전달합니다.
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
name TEXT,
age INTEGER
)
""")
2. cursor.executemany
이 방법을 사용하면 매번 다른 매개변수를 사용하여 동일한 SQL 문을 두 번 이상 실행할 수 있습니다. SQL 문과 iterable이라는 두 가지 인수를 사용합니다. 이를 위한 좋은 용도는 한 번에 여러 개체를 DB에 삽입하는 것입니다. 다음 코드는 excutemany 메소드를 사용하여 DB에 값을 여러 번 삽입합니다.
data = [
('Alice', 25),
('Bob', 30),
('Charlie', 22)
]
cursor.executemany("""INSERT INTO users (name, age) VALUES (?, ?)""", data)
3. cursor.executescript
이 방법은 SQL 스크립트를 실행합니다. SQL 문을 다른 파일에 작성하고 executescript 메서드를 사용하여 실행할 수 있습니다.
with open("path/to/script.sql") as file:
sql_script = file.read()
cursor.executescript(sql_script)
Python과 SQLite3을 사용하여 등록 앱 구축하기
등록 앱의 로직에는 Python으로 사용자 정보를 가져와 DB에 저장하는 작업이 포함됩니다. 이 단계에서는 Python 및 SQLite3을 사용하여 간단한 등록 시스템을 만드는 방법을 보여줍니다.
1단계: 기존 DB에 연결하거나 새 DB 만들기
앱에 대한 DB를 생성하거나 기존 DB에 연결하는 것부터 시작합니다. 이 코드는 연결된 DB와 상호 작용하기 위한 연결 개체와 커서를 생성합니다.
import sqlite3
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
# your app's code goes here
cursor.close()
conn.close()
2단계: 사용자를 위한 테이블 생성
사용자가 등록할 때 제공할 데이터를 저장하려면 테이블이 필요합니다. 이 코드는 DB에 users라는 테이블이 없는 경우 생성합니다. 사용자 정보를 보관하기 위해 테이블에 4개의 열을 만듭니다. 이메일 필드는 사용자가 동일한 이메일로 여러 계정을 생성하는 것을 방지하기 위한 것으로 고유(unique)합니다.
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
first_name TEXT,
last_name TEXT,
email TEXT UNIQUE,
password TEXT
)
""")
conn.commit()
conn.commit에 대한 호출은 쿼리를 DB에 커밋하는 데 중요합니다. 그렇지 않으면 데이터베이스가 변경되지 않습니다.
Executescript 메소드를 사용하는 경우 SQL 파일 끝에 COMMIT 키워드를 추가할 수 있으므로 conn.commit을 호출할 필요가 없습니다.
3단계: 사용자 데이터 수집
Python 함수를 사용하면 코드를 쉽게 재사용할 수 있으므로 등록 기능을 처리하는 함수를 만드는 것이 좋습니다. 이 함수는 사용자의 이름, 성, 이메일, 비밀번호를 수집합니다.
def register_user():
first_name = input("Enter your first name: ")
last_name = input("Enter your last name: ")
email = input("Enter your email: ")
password1 = input("Enter your password: ")
password2 = input("Confirm your password: ")
4단계: 비밀번호 정확성 확인
사용자가 동일한 비밀번호를 두 번 입력하도록 Register_user 함수를 수정합니다. 그렇지 않은 경우 비밀번호를 다시 입력하라는 메시지를 표시해야 합니다.
def register_user():
first_name = input("Enter your first name: ")
last_name = input("Enter your last name: ")
email = input("Enter your email: ")
while True:
password1 = input("Enter your password: ")
password2 = input("Confirm your password: ")
# Check password correctness
if password1 == password2:
print("You have successfully registered!")
break
else:
print("Your passwords must match")
이렇게 하면 사용자는 비밀번호가 일치하지 않으면 등록할 수 없습니다.
5단계: 이메일 고유성 확인
사용자 테이블을 생성하는 SQL 문은 이메일 필드를 고유하게 정의합니다. 이는 사용자가 이미 존재하는 이메일로 가입하면 데이터베이스가 오류를 반환한다는 의미입니다. 적절하게 행동하려면 Python 예외를 처리해야 합니다.
def register_user():
first_name = input("Enter your first name: ")
last_name = input("Enter your last name: ")
while True:
email = input("Enter your email: ")
password1 = input("Enter your password: ")
password2 = input("Confirm your password: ")
# Check password correctness
if password1 == password2:
try:
print("You have successfully created an account.")
break
except sqlite3.IntegrityError:
print("Error: This email is already registered.")
else:
print("Your passwords must match.")
이 코드는 Try-Exception 블록을 사용하여 이메일 중복으로 인해 발생하는 오류를 처리합니다. 데이터베이스에서 IntegrityError가 발생하면 while 루프가 계속 진행되어 사용자에게 다른 이메일 주소를 입력하라는 메시지가 표시됩니다.
6단계: DB에 사용자 데이터 삽입
사용자 데이터를 수집하고 확인했으므로 이를 데이터베이스에 추가할 차례입니다. 이를 수행하려면 SQL 쿼리를 사용할 수 있습니다. Try-Exception 블록을 다음과 같이 수정합니다.
try:
cursor.execute("""
INSERT INTO users (first_name, last_name, email, password)
VALUES (?, ?, ?, ?)
""", (first_name, last_name, email, password2))
conn.commit()
print("You have successfully created an account.")
break
except sqlite3.IntegrityError:
print("Error: This email is already registered.")
수정된 Try-Exception 블록에서 커서는 SQL 삽입 작업을 실행합니다. 마지막으로 conn.commit 메소드는 SQL 작업을 DB에 커밋합니다.
위의 모든 단계를 수행했다면 사용자를 등록하고 데이터베이스에 저장하는 애플리케이션이 있어야 합니다. SQLite용 DB 브라우저와 같은 앱을 사용하여 데이터베이스 내용을 볼 수 있습니다.
간단한 데이터베이스의 경우 자체 코드를 롤링하는 것이 더 쉬울 수 있습니다. 그러나 애플리케이션이 커지고 데이터베이스가 복잡해지면 Django ORM과 같은 도구를 사용하는 것이 좋습니다.
'Python' 카테고리의 다른 글
Python에서 데이터 분석을 위해 Pandas를 사용하는 방법 (45) | 2023.12.03 |
---|---|
Python If-Else 문을 사용하는 방법 (2) | 2023.12.01 |
데이터 구조와 알고리즘 코딩 과제를 연습할 수 있는 사이트 7개 (0) | 2023.11.13 |
모든 Python 프로그래머가 알아야 할 7가지 목록 관련 함수 (4) | 2023.11.09 |
Pandas와 Python으로 데이터 랭글링을 공부하는 7단계 (62) | 2023.10.28 |