Python은 핵심 라이브러리 내에서 강력한 데이터베이스 기능을 원활하게 통합하여 사용자가 Django 객체 관계형 매핑(ORM) 프레임워크에서 제공하는 것과 같은 보조 아키텍처와 독립적으로 데이터베이스를 구축하고 조작할 수 있도록 지원합니다.
Python의 SQLite 통합으로 원활한 구현이 가능하여 개발자에게 매우 효율적이고 간소화된 환경을 제공합니다. 웹 개발 프로젝트의 맥락에서 SQL 명령의 실제 적용을 보여주는 직관적인 사용자 등록 애플리케이션을 통해 Python을 사용한 데이터베이스 프로그래밍의 기본 개념을 살펴봅니다.
파이썬으로 데이터베이스를 만드는 방법
이 튜토리얼에 사용된 소스 코드는 소프트웨어 구현의 저장소 역할을 하는 GitHub 리포지토리를 통해 액세스할 수 있습니다.
Python을 사용하여 데이터베이스와 통신하기 위해서는 데이터베이스에 연결하는 수단과 커서를 통해 데이터베이스 내의 데이터를 조작하는 방법을 모두 확보해야 합니다.
연결을 설정하면 애플리케이션과 기존 데이터베이스 간에 통신을 설정하거나 완전히 새로운 데이터베이스를 만들 수 있습니다. 이 예제에서는 SQLite를 예제 데이터베이스 관리 시스템으로 사용하여 Python에 대한 연결을 설정하는 방법을 보여드리겠습니다.
import sqlite3
# Connect to a (new) database
conn = sqlite3.connect('path/to/database.db')
# Close the connection
conn.close()
`connect()` 함수는 기존 데이터베이스에 해당하는 파일 경로를 받습니다. 지정된 디렉터리에 데이터베이스가 없는 경우 자동으로 데이터베이스를 생성합니다. 데이터베이스와의 모든 상호 작용이 완료되면 데이터베이스 연결을 해제하는 것이 좋습니다.
파이썬에서 연결된 데이터베이스와의 상호 작용을 용이하게 하기 위해 커서 객체를 활용할 수 있습니다. 이러한 객체를 생성하려면 Python 프로그램의 컨텍스트 내에서 SQL 쿼리를 실행해야 합니다.
cursor = conn.cursor()
# Close the cursor
cursor.close()
커서는 연결된 데이터베이스 세션의 인스턴스에서 `cursor()` 메서드를 호출하여 생성될 수 있습니다.
파이썬에서 데이터베이스 트랜잭션을 실행하는 방법
커서를 사용하면 데이터를 검색 또는 수정하거나 데이터베이스의 구성을 조정할 목적으로 SQL 문, 조회 또는 스크립트를 실행할 수 있습니다.
데이터베이스 트랜잭션을 실행하기 위해 세 가지 주요 전략을 사용할 수 있습니다:
`Cursor.execute()` 메서드는 단일 SQL 문을 실행하는 데 사용됩니다. 이 메서드를 사용하려면 커서 객체의 `execute()` 메서드에 SQL 문이 포함된 문자열을 인수로 전달해야 합니다.
`Cursor.execute` 메서드를 사용하면 중간에 다양한 입력 매개 변수를 사용하여 단일 SQL 문을 반복적으로 실행할 수 있습니다.기본적으로 이 메서드는 다양한 매개변수 집합을 가진 반복적인 SQL 쿼리를 활용하여 데이터베이스 내에서 데이터를 효율적으로 삽입하거나 업데이트하는 수단으로 사용됩니다. 제공된 코드 스니펫에서 볼 수 있듯이, 한 번에 여러 레코드를 데이터베이스에 삽입하기 위해 `executemany` 메서드가 사용됩니다.
“Cursor.executeScript” 메서드는 사용자를 대신하여 SQL 스크립트를 실행하도록 설계되었습니다. 이 기술을 사용하면 사용자가 별도의 파일 내에 SQL 문을 생성한 다음 “executeScript” 메서드를 사용하여 해당 문을 실행할 수 있습니다.
파이썬과 SQLite3로 등록 앱을 구축하는 방법
등록 애플리케이션을 개발하기 위해서는 파이썬과 SQLite3와 같은 적절한 데이터베이스 관리 시스템을 사용하여 사용자 데이터를 수집하고 저장하는 것이 필수적입니다. 이 가이드는 Python과 SQLite3를 활용한 기본 등록 시스템 생성에 대한 포괄적인 개요를 제공합니다.
1단계: 기존 데이터베이스에 연결 또는 신규 데이터베이스 생성
애플리케이션을 개발하기 위해서는 데이터 저장소를 구축하거나 기존 데이터베이스와 연결해야 합니다. 여기에는 애플리케이션 내에서 사용될 정보를 저장하고 구성하기 위해 데이터베이스 관리 시스템을 활용하는 것이 포함됩니다.
import sqlite3
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
# your app's code goes here
cursor.close()
conn.close()
이 코드는 연결 객체를 생성하여 데이터베이스에 대한 연결을 설정하여 애플리케이션과 데이터베이스 서버 간의 통신을 용이하게 합니다. 또한 연결된 데이터베이스에서 효율적인 데이터 검색 작업을 가능하게 하는 커서를 생성합니다.
2단계: 사용자를 위한 테이블 생성
사용자가 등록하는 동안 제출할 정보의 저장소를 설정하려면 다음과 같이 커서를 사용하여 테이블을 생성해야 합니다:
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
first_name TEXT,
last_name TEXT,
email TEXT UNIQUE,
password TEXT
)
""")
conn.commit()
본 구현에서는 데이터베이스 시스템 내에 존재하지 않을 수 있는 “사용자”라고 하는 표 형식의 표현을 쉽게 생성할 수 있습니다. 사용자 관련 데이터에 대한 저장 요건을 수용하기 위해, 본 실시예는 해당 테이블 내에 4개의 개별 열을 통합합니다. 또한, 각 개별 사용자가 단일하고 독점적인 이메일 주소를 제공하여 한 번만 등록할 수 있도록 이메일 필드를 추가하여 동일한 전자 메일 서신의 복제를 통해 중복된 사용자 등록이 발생하는 것을 방지할 수 있도록 설계되었습니다.
실제로 데이터베이스 시스템 내에서 데이터 수정의 지속성을 구현하기 위해서는 `conn.commit()`의 실행이 매우 중요합니다. 이 명령을 실행하지 않으면 데이터베이스에 변경 사항이 반영되지 않아 트랜잭션이 유효하지 않게 됩니다.
SQL 스크립트와 함께 `executeScript` 메서드를 활용할 경우, 스크립트 마지막에 `COMMIT` 문을 포함하면 `conn.commit()` 함수 호출을 통한 별도의 커밋 작업이 필요하지 않습니다.
3단계: 사용자 데이터 수집
파이썬 함수를 활용하면 코드를 편리하게 재사용할 수 있으므로 계정 생성 프로세스를 관리하는 운영 컴포넌트를 개발하는 것이 좋습니다. 이 기능 모듈은 개인의 이름, 가족 이름, 이메일 주소, 비밀번호를 수집합니다.
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 문은 이메일 필드가 고유해야 한다고 규정하고 있습니다. 따라서 사용자가 이전에 등록한 이메일 주소를 사용하여 등록하는 경우 데이터베이스에서 오류가 발생합니다. 올바르게 실행하려면 이러한 고유성 위반으로 인해 발생하는 파이썬 예외를 관리하는 것이 필수적입니다.
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.")
이 프로그램은 시도 예외 문을 통합하여 반복되는 이메일 주소로 인한 오류를 관리합니다. 무결성 위반이 발생하면 for 루프가 지속되어 사용자에게 다른 이메일 주소를 제공하도록 촉구합니다.
이 예시 애플리케이션의 맥락에서, 상기 소프트웨어 프로그램에서 발생하는 무결성 오류의 모든 인스턴스는 동일한 전자 메일 계정이 여러 번 발생하는 경우에만 침전된다고 가정하는 것이 합리적입니다. 그러나 실제 운영 환경에서는 발생할 수 있는 추가적인 복잡성을 수용하기 위해 보다 정교한 예외 처리 시스템을 사용할 것으로 예상할 수 있습니다.
6단계: 데이터베이스에 사용자 데이터 삽입
수집된 정보를 데이터베이스 시스템에 통합하기 위해 구조화된 쿼리 언어(SQL) 명령을 활용하여 필요한 업데이트를 수행합니다. 프로세스를 성공적으로 실행하기 위해 시도를 조정할 수 있는 방법은 다음과 같습니다:
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-except 문 내에서 커서는 데이터 삽입을 위한 SQL 명령을 수행합니다. 그 후 `conn.commit()` 메서드를 사용하여 SQL 트랜잭션을 데이터베이스에 커밋합니다.
위의 모든 단계를 수행했다면 사용자를 등록하고 데이터베이스에 저장하는 애플리케이션이 있어야 합니다. SQLite용 DB 브라우저 과 같은 앱을 사용하여 데이터베이스의 내용을 볼 수 있습니다:
컬렉션 유형 대신 데이터베이스 사용
데이터베이스 요구 사항이 비교적 간단한 경우 개발자에게는 사용자 지정 SQL 쿼리를 만드는 것이 매력적인 옵션이 될 수 있습니다. 하지만 프로젝트의 범위가 확장되고 데이터베이스의 복잡성이 증가함에 따라 Django의 객체 관계형 매핑(ORM)과 같은 기존 프레임워크를 활용하면 데이터 관리 작업을 간소화하는 데 상당한 이점을 제공합니다.
저수준 데이터베이스 작업의 숙련도를 더욱 높이려면 사용자 등록 프로세스의 보조 기능으로 로그인 기능을 통합하는 것을 고려하세요.