3단계: pyodbc를 사용하여 SQL에 연결하는 개념 증명
이 샘플 개념 증명은 SQL 데이터베이스에 연결하는 데 사용합니다 pyodbc
. 이 샘플에서는 AdventureWorksLT 샘플 데이터베이스를 사용하고 있다고 가정합니다.
참고 항목
이 예제는 개념 증명으로만 간주해야 합니다. 이 샘플 코드는 명확한 이해를 위해 단순화되었으며 반드시 Microsoft에서 권장하는 모범 사례를 대표하지는 않습니다.
필수 조건
- Python 3
- Python이 아직 없는 경우 python.org Python 런타임 및 PyPI(Python 패키지 인덱스) 패키지 관리자를 설치합니다.
- 사용자 고유의 환경을 사용해 보지 않으시겠어요? GitHub Codespaces를 사용해서 devcontainer로 엽니다.
- PyPI의
pyodbc
패키지입니다. - Microsoft ODBC Driver 18 for SQL Server 설치
- SQL 데이터베이스 및 자격 증명입니다.
연결 및 데이터 쿼리
자격 증명을 사용하여 데이터베이스에 연결합니다.
이름이 app.py인 새 파일을 만듭니다.
모듈 독스트링을 추가합니다.
""" Connects to a SQL database using pyodbc """
pyodbc
패키지를 가져옵니다.import pyodbc
연결 자격 증명에 대한 변수를 만듭니다.
SERVER = '<server-address>' DATABASE = '<database-name>' USERNAME = '<username>' PASSWORD = '<password>'
문자열 보간을 사용하여 연결 문자열 변수를 만듭니다.
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
이 함수를
pyodbc.connect
사용하여 SQL 데이터베이스에 연결합니다.conn = pyodbc.connect(connectionString)
쿼리 실행
SQL 쿼리 문자열을 사용하여 쿼리를 실행하고 결과를 구문 분석합니다.
SQL 쿼리 문자열에 대한 변수를 만듭니다.
SQL_QUERY = """ SELECT TOP 5 c.CustomerID, c.CompanyName, COUNT(soh.SalesOrderID) AS OrderCount FROM SalesLT.Customer AS c LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.CompanyName ORDER BY OrderCount DESC; """
데이터베이스에 대한 쿼리에서 결과 집합을 검색하려면
cursor.execute
를 사용합니다.cursor = conn.cursor() cursor.execute(SQL_QUERY)
참고 항목
이 함수는 본질적으로 모든 쿼리를 허용하며, cursor.fetchone()을 사용하여 반복될 수 있는 결과 집합을 반환합니다.
루프를
cursor.fetchall
사용하여foreach
데이터베이스에서 모든 레코드를 가져옵니다. 그런 다음 레코드를 인쇄합니다.records = cursor.fetchall() for r in records: print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
app.py 파일을 저장합니다.
터미널을 열고 애플리케이션을 테스트합니다.
python app.py
29485 1 Professional Sales and Service 29531 1 Remarkable Bike Store 29546 1 Bulk Discount Store 29568 1 Coalition Bike Company 29584 1 Futuristic Bikes
행을 트랜잭션으로 삽입
이 예제에서는 INSERT
문을 안전하게 실행하고 매개 변수를 전달합니다. 매개 변수를 값으로 전달하면 SQL 삽입 공격으로부터 애플리케이션을 보호합니다.
randrange
라이브러리에서random
을 가져옵니다.from random import randrange
난수 제품 번호를 생성합니다.
productNumber = randrange(1000)
팁
여기에서 난수 제품 번호를 생성하면 이 샘플을 여러 번 실행할 수 있습니다.
SQL 문 문자열을 만듭니다.
SQL_STATEMENT = """ INSERT SalesLT.Product ( Name, ProductNumber, StandardCost, ListPrice, SellStartDate ) OUTPUT INSERTED.ProductID VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP) """
cursor.execute
을 사용하여 해당 문을 실행합니다.cursor.execute( SQL_STATEMENT, f'Example Product {productNumber}', f'EXAMPLE-{productNumber}', 100, 200 )
cursor.fetchval
를 사용하여 단일 결과의 첫 번째 열을 가져오고 결과의 고유 식별자를 인쇄한 이후에 작업을connection.commit
사용하여 트랜잭션으로 커밋합니다.resultId = cursor.fetchval() print(f"Inserted Product ID : {resultId}") conn.commit()
팁
필요에 따라 트랜잭션을 롤백하기
connection.rollback
위해서 사용할 수 있습니다.cursor.close
및connection.close
을 사용하여 커서 및 연결을 닫습니다.cursor.close() conn.close()
app.py 파일을 저장하고 애플리케이션을 다시 테스트합니다.
python app.py
Inserted Product ID : 1001