다음을 통해 공유


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

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

참고 항목

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

필수 조건

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

연결 및 데이터 쿼리

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

  1. app.py라는 새 파일을 만듭니다.

  2. 모듈 문서 문자열을 추가합니다.

    """
    Connects to a SQL database using pymssql
    """
    
  3. pymssql패키지를 가져와 보세요.

    import pymssql
    
  4. pymssql.connect함수를 사용하여 SQL 데이터베이스에 연결합니다.

    conn = pymssql.connect(
        server='<server-address>',
        user='<username>',
        password='<password>',
        database='<database-name>',
        as_dict=True
    )  
    

쿼리 실행

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 (%s, %s, %s, %s, CURRENT_TIMESTAMP)
    """
    
  4. cursor.execute을 사용하여 해당 문을 실행합니다.

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

    result = cursor.fetchone()
    print(f"Inserted Product ID : {result['ProductID']}")
    conn.commit()
    

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

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

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

    python app.py
    
    Inserted Product ID : 1001
    

다음 단계