3단계: pyodbc를 사용하여 SQL에 연결하는 개념 증명

이 샘플 개념 증명은 pyodbc 을 사용해서 SQL 데이터베이스에 연결하는 데 사용합니다. 이 샘플에서는 AdventureWorksLT 샘플 데이터베이스를 사용하고 있다고 가정합니다.

참고 항목

이 예제는 개념 증명으로만 간주해야 합니다. 이 샘플 코드는 명확한 이해를 돕기 위해 단순화되었으며 Microsoft에서 권장하는 모범 사례를 반드시 대표하는 것은 아닙니다.

필수 조건

  • Python 3
    • Python이 아직 없는 경우 python.org Python 런타임 PyPI(Python 패키지 인덱스) 패키지 관리자를 설치합니다.
    • 사용자 고유의 환경을 사용해 보지 않으시겠어요? GitHub Codespaces를 사용해서 devcontainer로 엽니다.
      • Open in GitHub Codespaces.
  • PyPI의 pyodbc패키지입니다.
  • Microsoft ODBC Driver 18 for SQL Server 설치
  • SQL 데이터베이스 및 자격 증명입니다.

연결 및 데이터 쿼리

자격 증명을 사용하여 데이터베이스에 연결합니다.

  1. 이름이 app.py인 새 파일을 만듭니다.

  2. 모듈 독스트링을 추가합니다.

    """
    Connects to a SQL database using pyodbc
    """
    
  3. pyodbc 패키지를 가져옵니다.

    import pyodbc
    
  4. 연결 자격 증명에 대한 변수를 만듭니다.

    SERVER = '<server-address>'
    DATABASE = '<database-name>'
    USERNAME = '<username>'
    PASSWORD = '<password>'
    
  5. 문자열 보간을 사용하여 연결 문자열 변수를 만듭니다.

    connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
    
  6. 함수를 pyodbc.connect사용하여 SQL 데이터베이스에 연결합니다.

    conn = pyodbc.connect(connectionString) 
    

쿼리 실행

SQL 쿼리 문자열을 사용하여 쿼리를 실행하고 결과를 구문 분석합니다.

  1. 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;
    """
    
  2. 데이터베이스에 대한 쿼리에서 결과 집합을 검색하려면 cursor.execute를 사용합니다.

    cursor = conn.cursor()
    cursor.execute(SQL_QUERY)
    

    참고 항목

    이 함수는 본질적으로 모든 쿼리를 허용하며, cursor.fetchone()을 사용하여 반복될 수 있는 결과 집합을 반환합니다.

  3. 루프를 cursor.fetchall사용하여 foreach데이터베이스에서 모든 레코드를 가져옵니다. 그런 다음 레코드를 인쇄합니다.

    records = cursor.fetchall()
    for r in records:
        print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
    
  4. app.py 파일을 저장합니다.

  5. 터미널을 열고 애플리케이션을 테스트합니다.

    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 삽입 공격으로부터 애플리케이션을 보호합니다.

  1. randrange 라이브러리에서 random을 가져옵니다.

    from random import randrange
    
  2. 난수 제품 번호를 생성합니다.

    productNumber = randrange(1000)
    

    여기에서 난수 제품 번호를 생성하면 이 샘플을 여러 번 실행할 수 있습니다.

  3. SQL 문 문자열을 만듭니다.

    SQL_STATEMENT = """
    INSERT SalesLT.Product (
    Name, 
    ProductNumber, 
    StandardCost, 
    ListPrice, 
    SellStartDate
    ) OUTPUT INSERTED.ProductID 
    VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
    """
    
  4. cursor.execute을 사용하여 해당 문을 실행합니다.

    cursor.execute(
        SQL_STATEMENT,
        f'Example Product {productNumber}', 
        f'EXAMPLE-{productNumber}', 
        100,
        200
    )
    
  5. cursor.fetchval를 사용하여 단일 결과의 첫 번째 열을 가져오고 결과의 고유 식별자를 인쇄한 이후에 작업을 connection.commit사용하여 트랜잭션으로 커밋합니다.

    resultId = cursor.fetchval()
    print(f"Inserted Product ID : {resultId}")
    conn.commit()
    

    필요에 따라 트랜잭션을 롤백하기 connection.rollback위해서 사용할 수 있습니다.

  6. cursor.closeconnection.close을 사용하여 커서 및 연결을 닫습니다.

    cursor.close()
    conn.close()
    
  7. app.py 파일을 저장하고 애플리케이션을 다시 테스트합니다

    python app.py
    
    Inserted Product ID : 1001
    

다음 단계