쿠키 기본 설정 선택

당사는 사이트와 서비스를 제공하는 데 필요한 필수 쿠키 및 유사한 도구를 사용합니다. 고객이 사이트를 어떻게 사용하는지 파악하고 개선할 수 있도록 성능 쿠키를 사용해 익명의 통계를 수집합니다. 필수 쿠키는 비활성화할 수 없지만 '사용자 지정' 또는 ‘거부’를 클릭하여 성능 쿠키를 거부할 수 있습니다.

사용자가 동의하는 경우 AWS와 승인된 제3자도 쿠키를 사용하여 유용한 사이트 기능을 제공하고, 사용자의 기본 설정을 기억하고, 관련 광고를 비롯한 관련 콘텐츠를 표시합니다. 필수가 아닌 모든 쿠키를 수락하거나 거부하려면 ‘수락’ 또는 ‘거부’를 클릭하세요. 더 자세한 내용을 선택하려면 ‘사용자 정의’를 클릭하세요.

Microsoft SQL Server에서 Amazon Aurora PostgreSQL-Compatible Edition으로 데이터베이스 마이그레이션을 지원하도록 Python 및 Perl 애플리케이션 변경 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Microsoft SQL Server에서 Amazon Aurora PostgreSQL-Compatible Edition으로 데이터베이스 마이그레이션을 지원하도록 Python 및 Perl 애플리케이션 변경

작성자: Dwarika Patra(AWS) 및 Deepesh Jayaprakash(AWS)

요약

이 패턴은 Microsoft SQL Server에서 Amazon Aurora PostgreSQL-Compatible Edition으로 데이터베이스를 마이그레이션할 때 필요할 수 있는 애플리케이션 리포지토리의 변경 사항을 설명합니다. 이 패턴은 이러한 애플리케이션이 Python 기반 또는 Perl 기반이라고 가정하며 이러한 스크립팅 언어에 대한 별도의 지침을 제공합니다.

SQL Server 데이터베이스를 Aurora PostgreSQL-Compatible로 마이그레이션하는 데에는 스키마 변환, 데이터베이스 객체 변환, 데이터 마이그레이션 및 데이터 로드가 필요합니다. PostgreSQL과 SQL Server 간의 차이(데이터 유형, 연결 객체, 구문 및 로직 관련)로 인해 가장 어려운 마이그레이션 작업은 PostgreSQL에서 올바르게 작동하도록 코드 베이스를 필요에 따라 변경하는 것입니다.

Python 기반 애플리케이션의 경우 연결 객체와 클래스는 시스템 전체에 분산되어 있습니다. 또한 Python 코드 베이스는 여러 라이브러리를 사용하여 데이터베이스에 연결할 수 있습니다. 데이터베이스 연결 인터페이스를 변경하면 애플리케이션의 인라인 쿼리를 실행하는 객체도 변경해야 합니다.

Perl 기반 애플리케이션의 경우 변경 사항에는 연결 객체, 데이터베이스 연결 드라이버, 정적 및 동적 인라인 SQL 문, 애플리케이션이 복잡한 동적 DML 쿼리와 결과 세트를 처리하는 방식이 포함됩니다.

애플리케이션을 마이그레이션할 때 FTP 서버를 Amazon Simple Storage Service(S3) 액세스로 교체하는 등 AWS에서 가능한 개선 사항을 고려할 수도 있습니다.

애플리케이션 마이그레이션 프로세스에는 다음과 같은 문제가 포함됩니다.

  • 연결 객체. 연결 객체가 여러 라이브러리 및 함수 호출을 포함하는 코드에 분산되어 있는 경우 PostgreSQL을 지원하도록 변경하는 일반적인 방법을 찾아야 할 수 있습니다.

  • 레코드 검색 또는 업데이트 중 오류 또는 예외 처리. 데이터베이스에서 변수, 결과 세트 또는 데이터 프레임을 반환하는 조건부 생성, 읽기, 업데이트, 삭제(CRUD) 작업을 수행하는 경우 오류나 예외로 인해 애플리케이션 오류와 연쇄적인 효과가 발생할 수 있습니다. 이러한 오류는 적절한 검증과 저장 시점을 통해 신중하게 처리해야 합니다. 이러한 저장 시점 중 하나는 BEGIN...EXCEPTION...END 블록 내에서 대규모 인라인 SQL 쿼리 또는 데이터베이스 객체를 호출하는 것입니다.

  • 트랜잭션 제어 및 유효성 검사. 여기에는 수동 및 자동 커밋과 롤백이 포함됩니다. Perl용 PostgreSQL 드라이버를 사용하려면 항상 자동 커밋 속성을 명시적으로 설정해야 합니다.

  • 동적 SQL 쿼리 처리. 이를 위해서는 쿼리 로직에 대한 깊은 이해와 쿼리가 예상대로 작동하는지 확인하기 위한 반복 테스트가 필요합니다.

  • 성능. 코드 변경으로 인해 애플리케이션 성능이 저하되지 않도록 해야 합니다.

이 패턴은 변환 프로세스를 자세히 설명합니다.

사전 조건 및 제한 사항

사전 조건 

  • Python 및 Perl 구문에 대한 실무 지식.

  • SQL Server 및 PostgreSQL의 기본 기술.

  • 기존 애플리케이션 아키텍처에 대한 이해.

  • 애플리케이션 코드, SQL Server 데이터베이스 및 PostgreSQL 데이터베이스에 대한 액세스 권한.

  • 애플리케이션 변경 사항을 개발, 테스트 및 검증하기 위한 보안 인증 정보를 통한 Windows 또는 Linux(또는 기타 Unix) 개발 환경에 대한 액세스 권한.

  • Python 기반 애플리케이션의 경우 데이터 프레임을 처리하기 위한 Pandas, 데이터베이스 연결을 위한 psycopg2 또는 SQLAlchemy와 같은 애플리케이션에 필요할 수 있는 표준 Python 라이브러리 필요.

  • Perl 기반 애플리케이션의 경우 종속 라이브러리 또는 모듈을 포함하는 Perl 패키지 필요. Comprehensive Perl Archive Network(CPAN) 모듈은 대부분의 애플리케이션 요구 사항을 지원할 수 있습니다.

  • 필요한 모든 종속 사용자 지정 라이브러리 또는 모듈. 

  • SQL Server에 대한 읽기 권한 및 Aurora에 대한 읽기/쓰기 권한을 위한 데이터베이스 보안 인증 정보.

  • 서비스 및 사용자를 통해 애플리케이션 변경 사항을 검증하고 디버깅하기 위한 PostgreSQL.

  • Visual Studio Code, Sublime Text 또는 pgAdmin과 같은 애플리케이션 마이그레이션 중 개발 도구에 대한 액세스 권한.

제한 사항

  • 일부 Python 또는 Perl 버전, 모듈, 라이브러리 및 패키지는 클라우드 환경과 호환되지 않습니다.

  • SQL Server에 사용되는 일부 타사 라이브러리 및 프레임워크는 PostgreSQL 마이그레이션을 지원하도록 대체할 수 없습니다. 

  • 성능 변화에 따라 애플리케이션, 인라인 Transact-SQL(T-SQL) 쿼리, 데이터베이스 함수 및 저장 프로시저를 변경해야 할 수도 있습니다.

  • PostgreSQL은 테이블 이름, 열 이름 및 기타 데이터베이스 객체에 소문자 이름을 지원합니다. 

  • UUID 열과 같은 일부 데이터 유형은 소문자로만 저장됩니다. Python 및 Perl 애플리케이션은 이러한 대소문자 차이를 처리해야 합니다. 

  • 문자 인코딩 차이는 PostgreSQL 데이터베이스의 해당 텍스트 열에 대해 올바른 데이터 유형으로 처리해야 합니다.                               

제품 버전

  • Python 3.6 이상(사용자 운영 체제를 지원하는 버전 사용)

  • Perl 5.8.3 이상(사용자 운영 체제를 지원하는 버전 사용)

  • Aurora PostgreSQL-Compatible Edition 4.2 이상(세부 정보 참조)

아키텍처

소스 기술 스택

  • 스크립팅(애플리케이션 프로그래밍) 언어: Python 2.7 이상 또는 Perl 5.8 

  • 데이터베이스: Microsoft SQL Server 버전 13

  • 운영 체제: Red Hat Enterprise Linux(RHEL) 7 

대상 기술 스택  

  • 스크립팅(애플리케이션 프로그래밍) 언어: Python 3.6 이상 또는 Perl 5.8 이상 

  • 데이터베이스: Aurora PostgreSQL-Compatible 4.2

  • 운영 체제: RHEL 7 

마이그레이션 아키텍처

SQL Server를 사용하여 Perl 또는 Python 애플리케이션을 Aurora PostgreSQL-Compatible로 마이그레이션

도구

AWS 서비스 및 도구

  • Aurora PostgreSQL–Compatible Edition은 하이엔드 상용 데이터베이스의 속도와 안정성에 오픈 소스 데이터베이스의 비용 효율성을 결합한 완전 관리형 PostgreSQL 호환 및 ACID 호환 관계형 데이터베이스 엔진입니다. Aurora PostgreSQL은 PostgreSQL을 대체하는 기능으로 신규 및 기존 PostgreSQL 배포를 간편하고 비용 효율적으로 설정, 운영 및 확장할 수 있습니다.

  • AWS Command Line Interface(AWS CLI)는 명령줄 쉘의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다.

기타 도구

에픽

작업설명필요한 기술

다음 코드 변환 단계에 따라 애플리케이션을 PostgreSQL로 마이그레이션합니다.

  1. PostgreSQL용 데이터베이스 관련 ODBC 드라이버 및 라이브러리를 설정합니다. 예를 들어 Perl의 CPAN 모듈 및 Python의 pyodbc, psycopg2 또는 SQLAlchemy 중 하나를 사용할 수 있습니다.

  2. 이러한 라이브러리를 사용하여 Aurora PostgreSQL-Compatible에 연결함으로써 데이터베이스 객체를 변환합니다.

  3. 기존 애플리케이션 모듈에서 코드 변경 사항을 적용하여 호환되는 T-SQL 문을 가져옵니다.

  4. 애플리케이션 코드에 데이터베이스 관련 함수 호출 및 저장 프로시저를 다시 작성합니다.

  5. 인라인 SQL 쿼리에 사용되는 애플리케이션 변수 및 데이터 유형에 대한 변경 사항을 처리합니다.

  6. 호환되지 않는 데이터베이스 관련 함수를 처리합니다.

  7. 데이터베이스 마이그레이션을 위해 변환된 애플리케이션 코드의 엔드 투 엔드 테스트를 완료합니다.

  8. Microsoft SQL Server의 결과를 PostgreSQL로 마이그레이션한 애플리케이션과 비교합니다.

  9. Microsoft SQL Server와 PostgreSQL 간에 애플리케이션 성능 벤치마킹을 수행합니다.

  10. 애플리케이션에서 호출한 저장 프로시저 또는 인라인 T-SQL 문을 수정하여 성능을 개선합니다.

다음 에픽은 Python 및 Perl 애플리케이션의 이러한 변환 작업 중 일부에 대한 자세한 지침을 제공합니다.

앱 개발자

마이그레이션 각 단계마다 체크리스트를 사용합니다.

최종 단계를 포함하여 애플리케이션 마이그레이션의 각 단계에 대한 체크리스트에 다음을 추가합니다.

  • PostgreSQL 설명서를 검토하여 모든 변경 사항이 PostgreSQL 표준과 호환되는지 확인합니다.

  • 열에 정수 및 부동소수점 값이 있는지 확인합니다.

  • 열 이름 및 날짜/시간 스탬프와 함께 삽입, 업데이트 및 추출된 행 수를 식별합니다. diff 유틸리티를 사용하거나 스크립트를 작성하여 이러한 검사를 자동화할 수 있습니다.

  • 대규모 인라인 SQL 문에 대한 성능 검사를 완료하고 애플리케이션의 전체 성능을 확인합니다.

  • try/catch 블록을 여러 개 사용하여 데이터베이스 작업에 대한 오류 처리가 올바른지 확인하고 프로그램이 정상적으로 종료되는지 확인합니다.

  • 로깅 프로세스가 제대로 되어 있는지 확인합니다.

앱 개발자

애플리케이션 리포지토리를 PostgreSQL로 마이그레이션-고급 단계

작업설명필요한 기술

다음 코드 변환 단계에 따라 애플리케이션을 PostgreSQL로 마이그레이션합니다.

  1. PostgreSQL용 데이터베이스 관련 ODBC 드라이버 및 라이브러리를 설정합니다. 예를 들어 Perl의 CPAN 모듈 및 Python의 pyodbc, psycopg2 또는 SQLAlchemy 중 하나를 사용할 수 있습니다.

  2. 이러한 라이브러리를 사용하여 Aurora PostgreSQL-Compatible에 연결함으로써 데이터베이스 객체를 변환합니다.

  3. 기존 애플리케이션 모듈에서 코드 변경 사항을 적용하여 호환되는 T-SQL 문을 가져옵니다.

  4. 애플리케이션 코드에 데이터베이스 관련 함수 호출 및 저장 프로시저를 다시 작성합니다.

  5. 인라인 SQL 쿼리에 사용되는 애플리케이션 변수 및 데이터 유형에 대한 변경 사항을 처리합니다.

  6. 호환되지 않는 데이터베이스 관련 함수를 처리합니다.

  7. 데이터베이스 마이그레이션을 위해 변환된 애플리케이션 코드의 엔드 투 엔드 테스트를 완료합니다.

  8. Microsoft SQL Server의 결과를 PostgreSQL로 마이그레이션한 애플리케이션과 비교합니다.

  9. Microsoft SQL Server와 PostgreSQL 간에 애플리케이션 성능 벤치마킹을 수행합니다.

  10. 애플리케이션에서 호출한 저장 프로시저 또는 인라인 T-SQL 문을 수정하여 성능을 개선합니다.

다음 에픽은 Python 및 Perl 애플리케이션의 이러한 변환 작업 중 일부에 대한 자세한 지침을 제공합니다.

앱 개발자

마이그레이션 각 단계마다 체크리스트를 사용합니다.

최종 단계를 포함하여 애플리케이션 마이그레이션의 각 단계에 대한 체크리스트에 다음을 추가합니다.

  • PostgreSQL 설명서를 검토하여 모든 변경 사항이 PostgreSQL 표준과 호환되는지 확인합니다.

  • 열에 정수 및 부동소수점 값이 있는지 확인합니다.

  • 열 이름 및 날짜/시간 스탬프와 함께 삽입, 업데이트 및 추출된 행 수를 식별합니다. diff 유틸리티를 사용하거나 스크립트를 작성하여 이러한 검사를 자동화할 수 있습니다.

  • 대규모 인라인 SQL 문에 대한 성능 검사를 완료하고 애플리케이션의 전체 성능을 확인합니다.

  • try/catch 블록을 여러 개 사용하여 데이터베이스 작업에 대한 오류 처리가 올바른지 확인하고 프로그램이 정상적으로 종료되는지 확인합니다.

  • 로깅 프로세스가 제대로 되어 있는지 확인합니다.

앱 개발자
작업설명필요한 기술

기존 Python 코드 베이스를 분석합니다.

분석에는 애플리케이션 마이그레이션 프로세스를 용이하게 하는 다음 내용이 포함되어야 합니다.

  • 코드의 모든 연결 객체를 식별합니다.

  • 호환되지 않는 모든 인라인 SQL 쿼리(예: T-SQL 문 및 저장 프로시저)를 식별하고 필요한 변경 사항을 분석합니다.

  • 코드 설명서를 검토하고 제어 흐름을 추적하여 코드 기능을 이해합니다. 나중에 애플리케이션의 성능 또는 로드 비교를 테스트할 때 유용합니다.

  • 데이터베이스 변환 후 효과적으로 테스트할 수 있도록 애플리케이션의 용도를 이해합니다. 데이터베이스 마이그레이션을 통한 변환 대상이 되는 대부분의 Python 애플리케이션은 다른 소스에서 데이터베이스 테이블로 데이터를 로드하는 피드이거나, 또는 테이블에서 데이터를 검색하여 보고서를 생성하거나 검증을 수행하기 위한 API 호출에 적합한 다양한 출력 형식(예: CSV, JSON 또는 플랫 파일)으로 변환하는 추출기입니다. 

앱 개발자

PostgreSQL을 지원하도록 데이터베이스 연결을 변환합니다.

대부분의 Python 애플리케이션은 다음과 같이 pyodbc 라이브러리를 사용하여 SQL Server 데이터베이스에 연결합니다.

import pyodbc .... try: conn_string = "Driver=ODBC Driver 17 for SQL Server;UID={};PWD={};Server={};Database={}".format (conn_user, conn_password, conn_server, conn_database) conn = pyodbc.connect(conn_string) cur = conn.cursor() result = cur.execute(query_string) for row in result: print (row) except Exception as e: print(str(e))

다음과 같이 PostgreSQL을 지원하도록 데이터베이스 연결을 변환합니다.

import pyodbc import psycopg2 .... try: conn_string = ‘postgresql+psycopg2://’+ conn_user+’:’+conn_password+’@’+conn_server+’/’+conn_database conn = pyodbc.connect(conn_string, connect_args={‘options’:’-csearch_path=dbo’}) cur = conn.cursor() result = cur.execute(query_string) for row in result: print (row) except Exception as e: print(str(e))
앱 개발자

인라인 SQL 쿼리를 PostgreSQL로 변경합니다.

인라인 SQL 쿼리를 PostgreSQL 호환 형식으로 변환합니다. 예를 들어 다음 SQL Server 쿼리는 테이블에서 문자열을 검색합니다.

dtype = “type1” stm = ‘“SELECT TOP 1 searchcode FROM TypesTable (NOLOCK) WHERE code=”’ + “’” + str(dtype) + “’” # For Microsoft SQL Server Database Connection engine = create_engine(‘mssql+pyodbc:///?odbc_connect=%s’ % urllib.parse.quote_plus(conn_string), connect_args={‘connect_timeout’:login_timeout}) conn = engine_connect() rs = conn.execute(stm) for row in rs: print(row)

변환 후 PostgreSQL 호환 인라인 SQL 쿼리는 다음과 같습니다.

dtype = “type1” stm = ‘“SELECT searchcode FROM TypesTable WHERE code=”’ + “’” + str(dtype) + “’ LIMIT 1” # For PostgreSQL Database Connection engine = create_engine(‘postgres+psycopg2://%s’ %conn_string, connect_args={‘connect_timeout’:login_timeout}) conn = engine.connect() rs = conn.execute(stm) for row in rs: print(row)
앱 개발자

동적 SQL 쿼리를 처리합니다.

동적 SQL은 하나의 스크립트 또는 여러 Python 스크립트에 존재할 수 있습니다. 이전 예제에서는 Python의 문자열 대체 함수를 사용하여 동적 SQL 쿼리를 구성하기 위한 변수를 삽입하는 방법을 보여 주었습니다. 또 다른 접근 방식은 해당하는 경우 쿼리 문자열에 변수를 추가하는 것입니다. 

다음 예제에서는 함수가 반환한 값에 따라 쿼리 문자열을 즉시 구성합니다.

query = ‘“SELECT id from equity e join issues i on e.permId=i.permId where e.id’” query += get_id_filter(ids) + “ e.id is NOT NULL

이러한 유형의 동적 쿼리는 애플리케이션 마이그레이션 중에 매우 일반적입니다. 동적 쿼리를 처리하려면 다음 단계를 따르세요.

  • 전체 구문(예: JOIN 절이 있는 SELECT 문의 구문)을 확인합니다.

  • 쿼리에 사용된 모든 변수 또는 열 이름(예: iid)을 확인합니다.

  • 쿼리에 사용된 함수, 인수 및 반환 값(예: get_id_filter 및 그 인수 ids)을 확인합니다.

앱 개발자

결과 세트, 변수 및 데이터 프레임을 처리합니다.

Microsoft SQL Server의 경우 fetchone() 또는 fetchall()과 같은 Python 메서드를 사용하여 데이터베이스에서 결과 세트를 검색합니다. fetchmany(size)를 사용하여 결과 세트에서 반환할 레코드 수를 지정할 수도 있습니다. 이를 위해 다음 예제와 같이 pyodbc 연결 객체를 사용할 수 있습니다.

pyodbc (Microsoft SQL Server)

import pyodbc server = 'tcp:myserver.database.windows.net' database = 'exampledb' username = 'exampleusername' password = 'examplepassword' conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = conn.cursor() cursor.execute("SELECT * FROM ITEMS") row = cursor.fetchone() while row: print(row[0]) row = cursor.fetchone()

Aurora에서는 PostgreSQL에 연결하고 결과 세트를 가져오는 것과 같은 유사한 작업을 수행하기 위해 psycopg2 또는 SQLAlchemy를 사용할 수 있습니다. 이러한 Python 라이브러리는 다음 예제와 같이 PostgreSQL 데이터베이스 레코드를 탐색할 수 있는 연결 모듈과 커서 객체를 제공합니다.

psycopg2 (Aurora PostgreSQL-Compatible)

import psycopg2 query = "SELECT * FROM ITEMS;" //Initialize variables host=dbname=user=password=port=sslmode=connect_timeout="" connstring = "host='{host}' dbname='{dbname}' user='{user}' \ password='{password}'port='{port}'".format(host=host,dbname=dbname,\ user=user,password=password,port=port) conn = psycopg2.connect(connstring) cursor = conn.cursor() cursor.execute(query) column_names = [column[0] for column in cursor.description] print("Column Names: ", column_names) print("Column values: " for row in cursor: print("itemid :", row[0]) print("itemdescrption :", row[1]) print("itemprice :", row[3]))

SQLAlchemy (Aurora PostgreSQL-Compatible)

from sqlalchemy import create_engine from pandas import DataFrame conn_string = 'postgresql://core:database@localhost:5432/exampledatabase' engine = create_engine(conn_string) conn = engine.connect() dataid = 1001 result = conn.execute("SELECT * FROM ITEMS") df = DataFrame(result.fetchall()) df.columns = result.keys() df = pd.DataFrame() engine.connect() df = pd.read_sql_query(sql_query, engine, coerce_float=False) print(“df=”, df)
앱 개발자

마이그레이션 도중과 마이그레이션 후에 애플리케이션을 테스트합니다.

마이그레이션된 Python 애플리케이션을 테스트하는 것은 지속적인 프로세스입니다. 마이그레이션에는 연결 객체 변경(psycopg2 또는 SQLAlchemy), 오류 처리, 새 기능(데이터 프레임), 인라인 SQL 변경, 대량 복사 기능(COPY 대신 bcp) 및 유사한 변경 사항이 포함되므로 애플리케이션 마이그레이션 도중 및 후에 신중하게 테스트해야 합니다. 다음을 확인합니다.

  • 오류 조건 및 처리 

  • 마이그레이션 후 레코드 불일치

  • 레코드 업데이트 또는 삭제

  • 애플리케이션 실행에 필요한 시간 

앱 개발자

애플리케이션 분석 및 업데이트-Python 코드 베이스

작업설명필요한 기술

기존 Python 코드 베이스를 분석합니다.

분석에는 애플리케이션 마이그레이션 프로세스를 용이하게 하는 다음 내용이 포함되어야 합니다.

  • 코드의 모든 연결 객체를 식별합니다.

  • 호환되지 않는 모든 인라인 SQL 쿼리(예: T-SQL 문 및 저장 프로시저)를 식별하고 필요한 변경 사항을 분석합니다.

  • 코드 설명서를 검토하고 제어 흐름을 추적하여 코드 기능을 이해합니다. 나중에 애플리케이션의 성능 또는 로드 비교를 테스트할 때 유용합니다.

  • 데이터베이스 변환 후 효과적으로 테스트할 수 있도록 애플리케이션의 용도를 이해합니다. 데이터베이스 마이그레이션을 통한 변환 대상이 되는 대부분의 Python 애플리케이션은 다른 소스에서 데이터베이스 테이블로 데이터를 로드하는 피드이거나, 또는 테이블에서 데이터를 검색하여 보고서를 생성하거나 검증을 수행하기 위한 API 호출에 적합한 다양한 출력 형식(예: CSV, JSON 또는 플랫 파일)으로 변환하는 추출기입니다. 

앱 개발자

PostgreSQL을 지원하도록 데이터베이스 연결을 변환합니다.

대부분의 Python 애플리케이션은 다음과 같이 pyodbc 라이브러리를 사용하여 SQL Server 데이터베이스에 연결합니다.

import pyodbc .... try: conn_string = "Driver=ODBC Driver 17 for SQL Server;UID={};PWD={};Server={};Database={}".format (conn_user, conn_password, conn_server, conn_database) conn = pyodbc.connect(conn_string) cur = conn.cursor() result = cur.execute(query_string) for row in result: print (row) except Exception as e: print(str(e))

다음과 같이 PostgreSQL을 지원하도록 데이터베이스 연결을 변환합니다.

import pyodbc import psycopg2 .... try: conn_string = ‘postgresql+psycopg2://’+ conn_user+’:’+conn_password+’@’+conn_server+’/’+conn_database conn = pyodbc.connect(conn_string, connect_args={‘options’:’-csearch_path=dbo’}) cur = conn.cursor() result = cur.execute(query_string) for row in result: print (row) except Exception as e: print(str(e))
앱 개발자

인라인 SQL 쿼리를 PostgreSQL로 변경합니다.

인라인 SQL 쿼리를 PostgreSQL 호환 형식으로 변환합니다. 예를 들어 다음 SQL Server 쿼리는 테이블에서 문자열을 검색합니다.

dtype = “type1” stm = ‘“SELECT TOP 1 searchcode FROM TypesTable (NOLOCK) WHERE code=”’ + “’” + str(dtype) + “’” # For Microsoft SQL Server Database Connection engine = create_engine(‘mssql+pyodbc:///?odbc_connect=%s’ % urllib.parse.quote_plus(conn_string), connect_args={‘connect_timeout’:login_timeout}) conn = engine_connect() rs = conn.execute(stm) for row in rs: print(row)

변환 후 PostgreSQL 호환 인라인 SQL 쿼리는 다음과 같습니다.

dtype = “type1” stm = ‘“SELECT searchcode FROM TypesTable WHERE code=”’ + “’” + str(dtype) + “’ LIMIT 1” # For PostgreSQL Database Connection engine = create_engine(‘postgres+psycopg2://%s’ %conn_string, connect_args={‘connect_timeout’:login_timeout}) conn = engine.connect() rs = conn.execute(stm) for row in rs: print(row)
앱 개발자

동적 SQL 쿼리를 처리합니다.

동적 SQL은 하나의 스크립트 또는 여러 Python 스크립트에 존재할 수 있습니다. 이전 예제에서는 Python의 문자열 대체 함수를 사용하여 동적 SQL 쿼리를 구성하기 위한 변수를 삽입하는 방법을 보여 주었습니다. 또 다른 접근 방식은 해당하는 경우 쿼리 문자열에 변수를 추가하는 것입니다. 

다음 예제에서는 함수가 반환한 값에 따라 쿼리 문자열을 즉시 구성합니다.

query = ‘“SELECT id from equity e join issues i on e.permId=i.permId where e.id’” query += get_id_filter(ids) + “ e.id is NOT NULL

이러한 유형의 동적 쿼리는 애플리케이션 마이그레이션 중에 매우 일반적입니다. 동적 쿼리를 처리하려면 다음 단계를 따르세요.

  • 전체 구문(예: JOIN 절이 있는 SELECT 문의 구문)을 확인합니다.

  • 쿼리에 사용된 모든 변수 또는 열 이름(예: iid)을 확인합니다.

  • 쿼리에 사용된 함수, 인수 및 반환 값(예: get_id_filter 및 그 인수 ids)을 확인합니다.

앱 개발자

결과 세트, 변수 및 데이터 프레임을 처리합니다.

Microsoft SQL Server의 경우 fetchone() 또는 fetchall()과 같은 Python 메서드를 사용하여 데이터베이스에서 결과 세트를 검색합니다. fetchmany(size)를 사용하여 결과 세트에서 반환할 레코드 수를 지정할 수도 있습니다. 이를 위해 다음 예제와 같이 pyodbc 연결 객체를 사용할 수 있습니다.

pyodbc (Microsoft SQL Server)

import pyodbc server = 'tcp:myserver.database.windows.net' database = 'exampledb' username = 'exampleusername' password = 'examplepassword' conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = conn.cursor() cursor.execute("SELECT * FROM ITEMS") row = cursor.fetchone() while row: print(row[0]) row = cursor.fetchone()

Aurora에서는 PostgreSQL에 연결하고 결과 세트를 가져오는 것과 같은 유사한 작업을 수행하기 위해 psycopg2 또는 SQLAlchemy를 사용할 수 있습니다. 이러한 Python 라이브러리는 다음 예제와 같이 PostgreSQL 데이터베이스 레코드를 탐색할 수 있는 연결 모듈과 커서 객체를 제공합니다.

psycopg2 (Aurora PostgreSQL-Compatible)

import psycopg2 query = "SELECT * FROM ITEMS;" //Initialize variables host=dbname=user=password=port=sslmode=connect_timeout="" connstring = "host='{host}' dbname='{dbname}' user='{user}' \ password='{password}'port='{port}'".format(host=host,dbname=dbname,\ user=user,password=password,port=port) conn = psycopg2.connect(connstring) cursor = conn.cursor() cursor.execute(query) column_names = [column[0] for column in cursor.description] print("Column Names: ", column_names) print("Column values: " for row in cursor: print("itemid :", row[0]) print("itemdescrption :", row[1]) print("itemprice :", row[3]))

SQLAlchemy (Aurora PostgreSQL-Compatible)

from sqlalchemy import create_engine from pandas import DataFrame conn_string = 'postgresql://core:database@localhost:5432/exampledatabase' engine = create_engine(conn_string) conn = engine.connect() dataid = 1001 result = conn.execute("SELECT * FROM ITEMS") df = DataFrame(result.fetchall()) df.columns = result.keys() df = pd.DataFrame() engine.connect() df = pd.read_sql_query(sql_query, engine, coerce_float=False) print(“df=”, df)
앱 개발자

마이그레이션 도중과 마이그레이션 후에 애플리케이션을 테스트합니다.

마이그레이션된 Python 애플리케이션을 테스트하는 것은 지속적인 프로세스입니다. 마이그레이션에는 연결 객체 변경(psycopg2 또는 SQLAlchemy), 오류 처리, 새 기능(데이터 프레임), 인라인 SQL 변경, 대량 복사 기능(COPY 대신 bcp) 및 유사한 변경 사항이 포함되므로 애플리케이션 마이그레이션 도중 및 후에 신중하게 테스트해야 합니다. 다음을 확인합니다.

  • 오류 조건 및 처리 

  • 마이그레이션 후 레코드 불일치

  • 레코드 업데이트 또는 삭제

  • 애플리케이션 실행에 필요한 시간 

앱 개발자
작업설명필요한 기술

기존 Perl 코드베이스를 분석합니다.

분석에는 애플리케이션 마이그레이션 프로세스를 용이하게 하는 다음 내용이 포함되어야 합니다. 다음을 식별해야 합니다.

  • 모든 INI 또는 구성 기반 코드

  • 데이터베이스 관련 표준 Open Database Connectivity(ODBC) Perl 드라이버 또는 기타 사용자 지정 드라이버

  • 인라인 및 T-SQL 쿼리에 필요한 코드 변경

  • 다양한 Perl 모듈 간 상호 작용(예: 여러 기능 구성 요소에서 호출하거나 사용하는 단일 Perl ODBC 연결 객체)

  • 데이터 세트 및 결과 세트 처리

  • 외부, 종속 Perl 라이브러리

  • 애플리케이션에서 사용되는 모든 API

  • Aurora PostgreSQL-Compatible과 호환되는 Perl 버전 호환성 및 드라이버 호환성

앱 개발자

PostgreSQL을 지원하도록 Perl 애플리케이션과 DBI 모듈의 연결을 변환합니다.

Perl 기반 애플리케이션은 일반적으로 Perl 프로그래밍 언어의 표준 데이터베이스 액세스 모듈인 Perl DBI 모듈을 사용합니다. SQL Server 및 postgreSQL의 드라이버가 다른 동일한 DBI 모듈을 사용할 수 있습니다.

필수 Perl 모듈, 설치 및 기타 지침에 대한 자세한 내용은 DBD::Pg 설명서를 참조하세요. 다음 예제는 exampletest-aurorapg-database.cluster-sampleclusture.us-east.-rds.amazonaws.com에서 Aurora PostgreSQL-Compatible에 연결합니다.

#!/usr/bin/perl use DBI; use strict; my $driver = "Pg"; my $hostname = “exampletest-aurorapg-database-sampleclusture.us-east.rds.amazonaws.com” my $dsn = "DBI:$driver: dbname = $hostname;host = 127.0.0.1;port = 5432"; my $username = "postgres"; my $password = "pass123"; $dbh = DBI->connect("dbi:Pg:dbname=$hostname;host=$host;port=$port;options=$options", $username, $password, {AutoCommit => 0, RaiseError => 1, PrintError => 0} );
앱 개발자

인라인 SQL 쿼리를 PostgreSQL로 변경합니다.

애플리케이션에 SELECT, DELETE, UPDATE, 및 PostgreSQL에서 지원하지 않는 쿼리 절을 포함하는 유사한 문을 포함하는 인라인 SQL 쿼리가 있을 수 있습니다. 예를 들어 TOPNOLOCK과 같은 쿼리 키워드는 PostgreSQL에서 지원되지 않습니다. 다음 예는 TOP, NOLOCK 및 부울 변수를 처리할 수 있는 방법을 보여 줍니다.

SQL Server에서:

$sqlStr = $sqlStr . "WHERE a.student_id in (SELECT TOP $numofRecords c_student_id \ FROM active_student_record b WITH (NOLOCK) \ INNER JOIN student_contributor c WITH (NOLOCK) on c.contributor_id = b.c_st)

PostgreSQL의 경우 다음과 같이 변환합니다.

$sqlStr = $sqlStr . "WHERE a.student_id in (SELECT TOP $numofRecords c_student_id \ FROM active_student_record b INNER JOIN student_contributor c \ on c.contributor_id = b.c_student_contr_id WHERE b_current_1 is true \ LIMIT $numofRecords)"
앱 개발자

동적 SQL 쿼리와 Perl 변수를 처리합니다.

동적 SQL 쿼리는 애플리케이션 런타임 시 빌드되는 SQL 문입니다. 이러한 쿼리는 특정 조건에 따라 애플리케이션이 실행 중일 때 동적으로 구성되므로 런타임까지 쿼리의 전체 텍스트를 알 수 없습니다. 예를 들면 상위 10개 주식을 매일 분석하는 재무 분석 애플리케이션이 있으며, 이러한 주식은 매일 바뀝니다. SQL 테이블은 최고 성과자에 따라 생성되며 런타임까지 값을 알 수 없습니다.

이 예제의 인라인 SQL 쿼리를 래퍼 함수에 전달하여 변수에 결과 세트를 가져온 다음 변수가 조건을 사용하여 테이블이 존재하는지 여부를 판별한다고 가정해 보겠습니다.

  • 테이블이 존재한다면 생성하지 않고 몇 가지 처리를 수행합니다.

  • 테이블이 존재하지 않는 경우 테이블을 생성하고 몇 가지 처리도 수행합니다.

다음은 변수 처리의 예와 이 사용 사례에 대한 SQL Server 및 PostgreSQL 쿼리입니다.

my $tableexists = db_read( arg 1, $sql_qry, undef, 'writer'); my $table_already_exists = $tableexists->[0]{table_exists}; if ($table_already_exists){ # do some thing } else { # do something else }

SQL Server:

my $sql_qry = “SELECT OBJECT_ID('$backendTable', 'U') table_exists", undef, 'writer')";

PostgreSQL:

my $sql_qry = “SELECT TO_REGCLASS('$backendTable', 'U') table_exists", undef, 'writer')";

다음 예제에서는 JOIN과 함께 SELECT 문을 실행하여 테이블의 프라이머리 키와 키 열의 위치를 가져 오는 인라인 SQL의 Perl 변수를 사용합니다.

SQL Server:

my $sql_qry = "SELECT column_name', character_maxi mum_length \ FROM INFORMATION_SCHEMA.COLUMNS \ WHERE TABLE_SCHEMA='$example_schemaInfo' \ AND TABLE_NAME='$example_table' \ AND DATA_TYPE IN ('varchar','nvarchar');";

PostgreSQL:

my $sql_qry = "SELECT c1.column_name, c1.ordinal_position \ FROM information_schema.key_column_usage AS c LEFT \ JOIN information_schema.table_constraints AS t1 \ ON t1.constraint_name = c1.constraint_name \ WHERE t1.table_name = $example_schemaInfo'.'$example_table’ \ AND t1.constraint_type = 'PRIMARY KEY' ;";
앱 개발자

애플리케이션 분석 및 업데이트-Perl 코드 베이스

작업설명필요한 기술

기존 Perl 코드베이스를 분석합니다.

분석에는 애플리케이션 마이그레이션 프로세스를 용이하게 하는 다음 내용이 포함되어야 합니다. 다음을 식별해야 합니다.

  • 모든 INI 또는 구성 기반 코드

  • 데이터베이스 관련 표준 Open Database Connectivity(ODBC) Perl 드라이버 또는 기타 사용자 지정 드라이버

  • 인라인 및 T-SQL 쿼리에 필요한 코드 변경

  • 다양한 Perl 모듈 간 상호 작용(예: 여러 기능 구성 요소에서 호출하거나 사용하는 단일 Perl ODBC 연결 객체)

  • 데이터 세트 및 결과 세트 처리

  • 외부, 종속 Perl 라이브러리

  • 애플리케이션에서 사용되는 모든 API

  • Aurora PostgreSQL-Compatible과 호환되는 Perl 버전 호환성 및 드라이버 호환성

앱 개발자

PostgreSQL을 지원하도록 Perl 애플리케이션과 DBI 모듈의 연결을 변환합니다.

Perl 기반 애플리케이션은 일반적으로 Perl 프로그래밍 언어의 표준 데이터베이스 액세스 모듈인 Perl DBI 모듈을 사용합니다. SQL Server 및 postgreSQL의 드라이버가 다른 동일한 DBI 모듈을 사용할 수 있습니다.

필수 Perl 모듈, 설치 및 기타 지침에 대한 자세한 내용은 DBD::Pg 설명서를 참조하세요. 다음 예제는 exampletest-aurorapg-database.cluster-sampleclusture.us-east.-rds.amazonaws.com에서 Aurora PostgreSQL-Compatible에 연결합니다.

#!/usr/bin/perl use DBI; use strict; my $driver = "Pg"; my $hostname = “exampletest-aurorapg-database-sampleclusture.us-east.rds.amazonaws.com” my $dsn = "DBI:$driver: dbname = $hostname;host = 127.0.0.1;port = 5432"; my $username = "postgres"; my $password = "pass123"; $dbh = DBI->connect("dbi:Pg:dbname=$hostname;host=$host;port=$port;options=$options", $username, $password, {AutoCommit => 0, RaiseError => 1, PrintError => 0} );
앱 개발자

인라인 SQL 쿼리를 PostgreSQL로 변경합니다.

애플리케이션에 SELECT, DELETE, UPDATE, 및 PostgreSQL에서 지원하지 않는 쿼리 절을 포함하는 유사한 문을 포함하는 인라인 SQL 쿼리가 있을 수 있습니다. 예를 들어 TOPNOLOCK과 같은 쿼리 키워드는 PostgreSQL에서 지원되지 않습니다. 다음 예는 TOP, NOLOCK 및 부울 변수를 처리할 수 있는 방법을 보여 줍니다.

SQL Server에서:

$sqlStr = $sqlStr . "WHERE a.student_id in (SELECT TOP $numofRecords c_student_id \ FROM active_student_record b WITH (NOLOCK) \ INNER JOIN student_contributor c WITH (NOLOCK) on c.contributor_id = b.c_st)

PostgreSQL의 경우 다음과 같이 변환합니다.

$sqlStr = $sqlStr . "WHERE a.student_id in (SELECT TOP $numofRecords c_student_id \ FROM active_student_record b INNER JOIN student_contributor c \ on c.contributor_id = b.c_student_contr_id WHERE b_current_1 is true \ LIMIT $numofRecords)"
앱 개발자

동적 SQL 쿼리와 Perl 변수를 처리합니다.

동적 SQL 쿼리는 애플리케이션 런타임 시 빌드되는 SQL 문입니다. 이러한 쿼리는 특정 조건에 따라 애플리케이션이 실행 중일 때 동적으로 구성되므로 런타임까지 쿼리의 전체 텍스트를 알 수 없습니다. 예를 들면 상위 10개 주식을 매일 분석하는 재무 분석 애플리케이션이 있으며, 이러한 주식은 매일 바뀝니다. SQL 테이블은 최고 성과자에 따라 생성되며 런타임까지 값을 알 수 없습니다.

이 예제의 인라인 SQL 쿼리를 래퍼 함수에 전달하여 변수에 결과 세트를 가져온 다음 변수가 조건을 사용하여 테이블이 존재하는지 여부를 판별한다고 가정해 보겠습니다.

  • 테이블이 존재한다면 생성하지 않고 몇 가지 처리를 수행합니다.

  • 테이블이 존재하지 않는 경우 테이블을 생성하고 몇 가지 처리도 수행합니다.

다음은 변수 처리의 예와 이 사용 사례에 대한 SQL Server 및 PostgreSQL 쿼리입니다.

my $tableexists = db_read( arg 1, $sql_qry, undef, 'writer'); my $table_already_exists = $tableexists->[0]{table_exists}; if ($table_already_exists){ # do some thing } else { # do something else }

SQL Server:

my $sql_qry = “SELECT OBJECT_ID('$backendTable', 'U') table_exists", undef, 'writer')";

PostgreSQL:

my $sql_qry = “SELECT TO_REGCLASS('$backendTable', 'U') table_exists", undef, 'writer')";

다음 예제에서는 JOIN과 함께 SELECT 문을 실행하여 테이블의 프라이머리 키와 키 열의 위치를 가져 오는 인라인 SQL의 Perl 변수를 사용합니다.

SQL Server:

my $sql_qry = "SELECT column_name', character_maxi mum_length \ FROM INFORMATION_SCHEMA.COLUMNS \ WHERE TABLE_SCHEMA='$example_schemaInfo' \ AND TABLE_NAME='$example_table' \ AND DATA_TYPE IN ('varchar','nvarchar');";

PostgreSQL:

my $sql_qry = "SELECT c1.column_name, c1.ordinal_position \ FROM information_schema.key_column_usage AS c LEFT \ JOIN information_schema.table_constraints AS t1 \ ON t1.constraint_name = c1.constraint_name \ WHERE t1.table_name = $example_schemaInfo'.'$example_table’ \ AND t1.constraint_type = 'PRIMARY KEY' ;";
앱 개발자
작업설명필요한 기술

추가 SQL Server 구문을 PostgreSQL로 변환합니다.

다음 변경 사항은 프로그래밍 언어에 상관없이 모든 애플리케이션에 적용됩니다.

  • 애플리케이션에서 사용하는 데이터베이스 객체를 적절한 새 스키마 이름으로 한정합니다.

  • PostgreSQL의 비교 기능과 대소문자 구분 일치를 위해 LIKE 연산자를 처리합니다.

  • DATEDIFF, DATEADD, GETDATE, CONVERT, CAST 연산자 등 지원되지 않는 데이터베이스 관련 함수를 처리합니다. 동등한 PostgreSQL 호환 함수는 추가 정보 섹션의 기본 또는 내장 SQL 함수를 참조하세요. 

  • 비교문에서 부울 값을 처리합니다.

  • 함수의 반환값을 처리합니다. 이러한 값은 레코드 세트, 데이터 프레임, 변수, 부울 값일 수 있습니다. 애플리케이션의 요구 사항에 따라 이를 처리하고 PostgreSQL을 지원합니다.

  • 새로운 사용자 정의 PostgreSQL 함수를 사용하여 익명 블록(예:BEGIN TRAN)을 처리합니다.

  • 행에 대한 대량 삽입을 변환합니다. 애플리케이션 내에서 호출되는 SQL Server 대량 복사(bcp) 유틸리티와 동일한 PostgreSQL 유틸리티는 COPY입니다.

  • 열 연결 연산자를 변환합니다. SQL Server는 문자열 연결에 +를 사용하지만 PostgreSQL은 ||을 사용합니다.

앱 개발자

PostgreSQL을 지원하도록 Perl 기반 또는 Python 기반 애플리케이션 추가 변경

작업설명필요한 기술

추가 SQL Server 구문을 PostgreSQL로 변환합니다.

다음 변경 사항은 프로그래밍 언어에 상관없이 모든 애플리케이션에 적용됩니다.

  • 애플리케이션에서 사용하는 데이터베이스 객체를 적절한 새 스키마 이름으로 한정합니다.

  • PostgreSQL의 비교 기능과 대소문자 구분 일치를 위해 LIKE 연산자를 처리합니다.

  • DATEDIFF, DATEADD, GETDATE, CONVERT, CAST 연산자 등 지원되지 않는 데이터베이스 관련 함수를 처리합니다. 동등한 PostgreSQL 호환 함수는 추가 정보 섹션의 기본 또는 내장 SQL 함수를 참조하세요. 

  • 비교문에서 부울 값을 처리합니다.

  • 함수의 반환값을 처리합니다. 이러한 값은 레코드 세트, 데이터 프레임, 변수, 부울 값일 수 있습니다. 애플리케이션의 요구 사항에 따라 이를 처리하고 PostgreSQL을 지원합니다.

  • 새로운 사용자 정의 PostgreSQL 함수를 사용하여 익명 블록(예:BEGIN TRAN)을 처리합니다.

  • 행에 대한 대량 삽입을 변환합니다. 애플리케이션 내에서 호출되는 SQL Server 대량 복사(bcp) 유틸리티와 동일한 PostgreSQL 유틸리티는 COPY입니다.

  • 열 연결 연산자를 변환합니다. SQL Server는 문자열 연결에 +를 사용하지만 PostgreSQL은 ||을 사용합니다.

앱 개발자
작업설명필요한 기술

AWS 서비스를 활용하여 성능을 개선합니다.

AWS 클라우드로 마이그레이션하면 애플리케이션 및 데이터베이스 설계를 개선하여 AWS 서비스를 활용할 수 있습니다. 예를 들어 Aurora PostgreSQL-Compatible 데이터베이스 서버에 연결된 Python 애플리케이션의 쿼리가 원래 Microsoft SQL Server 쿼리보다 시간이 더 많이 걸리는 경우 Aurora 서버에서 Amazon Simple Storage Service(S3) 버킷으로 직접 기록 데이터 피드를 생성하고 Amazon Athena 기반 SQL 쿼리를 사용하여 보고서를 생성하고 사용자 대시보드에 대한 데이터 쿼리를 분석하는 것을 고려할 수 있습니다.

앱 개발자, 클라우드 아키텍트

성능 개선

작업설명필요한 기술

AWS 서비스를 활용하여 성능을 개선합니다.

AWS 클라우드로 마이그레이션하면 애플리케이션 및 데이터베이스 설계를 개선하여 AWS 서비스를 활용할 수 있습니다. 예를 들어 Aurora PostgreSQL-Compatible 데이터베이스 서버에 연결된 Python 애플리케이션의 쿼리가 원래 Microsoft SQL Server 쿼리보다 시간이 더 많이 걸리는 경우 Aurora 서버에서 Amazon Simple Storage Service(S3) 버킷으로 직접 기록 데이터 피드를 생성하고 Amazon Athena 기반 SQL 쿼리를 사용하여 보고서를 생성하고 사용자 대시보드에 대한 데이터 쿼리를 분석하는 것을 고려할 수 있습니다.

앱 개발자, 클라우드 아키텍트

관련 리소스

추가 정보

Microsoft SQL Server와 Aurora PostgreSQL-Compatible은 모두 ANSI SQL 규격입니다. 하지만 Python 또는 Perl 애플리케이션을 SQL Server에서 PostgreSQL로 마이그레이션할 때는 여전히 구문, 열 데이터 유형, 기본 데이터베이스 관련 함수, 대량 삽입 및 대/소문자 구분에서 호환되지 않는 문제를 알고 있어야 합니다.

다음 섹션에서는 발생할 수 있는 불일치에 대한 자세한 내용을 제공합니다.

데이터 유형 비교

SQL Server에서 PostgreSQL로 데이터 유형을 변경하면 애플리케이션이 작동하는 결과 데이터가 크게 달라질 수 있습니다. 데이터 유형을 비교하려면 Sqlines 웹 사이트의 표를 참조하세요.

기본 또는 내장 SQL 함수

일부 함수의 동작은 SQL Server와 PostgreSQL 데이터베이스 간에 다릅니다. 다음 표에 비교가 나와 있습니다.

Microsoft SQL Server

설명

PostgreSQL

CAST 

값을 한 데이터 형식에서 다른 형식으로 변환합니다.

PostgreSQL type :: operator

GETDATE()

현재 데이터베이스 시스템 날짜 및 시간을 YYYY-MM-DD hh:mm:ss.mmm 형식으로 반환합니다.

CLOCK_TIMESTAMP

DATEADD

날짜에 시간/날짜 간격을 추가합니다.

INTERVAL 표현

CONVERT

값을 특정 데이터 형식으로 변환합니다.

TO_CHAR

DATEDIFF

두 날짜의 차이를 반환합니다.

DATE_PART

TOP

SELECT 결과 세트에서 행의 수를 제한합니다.

LIMIT/FETCH

익명 블록

구조화된 SQL 쿼리는 선언, 실행 파일, 예외 처리와 같은 섹션으로 구성됩니다. 다음 표는 간단한 익명 블록의 Microsoft SQL Server와 PostgreSQL 버전을 비교합니다. 복잡한 익명 블록의 경우 애플리케이션 내에서 사용자 지정 데이터베이스 함수를 호출하는 것이 좋습니다.

Microsoft SQL Server

PostgreSQL

my $sql_qry1= my $sql_qry2 = my $sqlqry = "BEGIN TRAN $sql_qry1 $sql_qry2 if @\@error !=0 ROLLBACK TRAN else COMIT TRAN";
my $sql_qry1= my $sql_qry2 = my $sql_qry = " DO \$\$ BEGIN $header_sql $content_sql END \$\$";

 

기타 차이점

  • 행 대량 삽입: Microsoft SQL Server bcp 유틸리티에 해당하는 PostgreSQL 유틸리티는 COPY입니다.

  • 대소문자 구분: PostgreSQL에서는 열 이름이 대소문자를 구분하므로 SQL Server 열 이름을 소문자나 대문자로 변환해야 합니다. 이는 데이터를 추출 또는 비교하거나 결과 세트 또는 변수에 열 이름을 배치할 때 요인이 됩니다. 다음 예제에서는 값이 대문자 또는 소문자로 저장될 수 있는 열을 식별합니다.

my $sql_qry = "SELECT $record_id FROM $exampleTable WHERE LOWER($record_name) = \'failed transaction\'";
  • 연결: SQL Server는 문자열 연결에 +를 연산자로 사용하는 반면 PostgreSQL은 ||을 사용합니다.

  • 검증: 인라인 SQL 쿼리 및 함수를 PostgreSQL용 애플리케이션 코드에서 사용하기 전에 먼저 테스트하고 검증해야 합니다.

  • ORM 라이브러리 포함: 기존 데이터베이스 연결 라이브러리를 SQLAlchemyPynomoDB와 같은 Python ORM 라이브러리로 포함하거나 대체할 수도 있습니다. 이를 통해 객체 지향 패러다임을 사용하여 데이터베이스의 데이터를 쉽게 쿼리하고 조작할 수 있습니다.

프라이버시사이트 이용 약관쿠키 기본 설정
© 2025, Amazon Web Services, Inc. 또는 계열사. All rights reserved.