python으로 postgres를 다룰 수 있습니다.

 

 

1. 파이썬 패키지 설치

postgres를 다루기 위한 파이썬 패키지(psycopg2)을 설치해줍니다.

pip install psycopg2-binary

 

2. postgres DB 연결

# PostgreSQL 연결 정보 설정
db_params = {
    "dbname": "postgres",
    "user": "postgres",
    "password": "1234",
    "host": "localhost",
    "port": "5432"
}

# PostgreSQL 연결
conn = psycopg2.connect(**db_params)

위 코드로 간단하게 연결할 수 있습니다.

db접근을 위한 연결정보인 db_params 변수에 오타나 잘못된 값이 입력되면 psycopg2.connect() 함수가 실행될 때 에러가 발생합니다.

오류가 발생했다면 DB가 제대로 설치되었는지, 오타가 없는지 확인이 필요합니다.

 

3. 간단한 테이블을 생성하고 INSERT 쿼리를 실행해보기

# 테이블 생성 쿼리
create_table_query = """
CREATE TABLE IF NOT EXISTS logging (
    log_id SERIAL PRIMARY KEY,
    log_datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    car_number VARCHAR(20),
    image_file_name VARCHAR(255),
    json_file_name VARCHAR(255),
    saved_location VARCHAR(255)
);
"""

cursor = conn.cursor()
cursor.execute(create_table_query)



# 로그 정보
log_data = {
    "car_number": "ABC123",
    "image_file_name": "example_image.jpg",
    "json_file_name": "example_json.json",
    "saved_location": "/path/to/save/location"
}

# 로그 정보 삽입
insert_query = """
INSERT INTO logging (car_number, image_file_name, json_file_name, saved_location)
VALUES (%s, %s, %s, %s);
"""
cursor.execute(insert_query, (
    log_data["car_number"],
    log_data["image_file_name"],
    log_data["json_file_name"],
    log_data["saved_location"]
))

# 변경사항 커밋
conn.commit()

# 연결 및 커서 닫기
cursor.close()
conn.close()

 

위 예제는 주차장이나 건물 차량 입구의 입출차에 대한 cctv 기록을 저장하는 테이블입니다.

'logging'이라는 테이블을 만들고  자동차 번호, 차량 촬영 이미지, 차량 정보 json 파일, cctv 위치 등의 데이터를 insert 해봤습니다.

 

 

DBeaver로 도 확인해보니 데이터가 잘 삽입되었네요 :)

oracle, bigquery만 주로 활용하다가 postgres를 사용할 일이 생겼습니다.

매우 반갑죠.

설치부터 시작하고 postgres에 대해 알아가야겠습니다.


설치

macOS환경에서 Docker로 설치합니다.

(Docker가 설치되어있다는 가정하에) 매우 간단해요.

docker pull postgress
docker run --name my-postgres-container -e POSTGRES_PASSWORD=1234 -p 5432:5432 -d postgres
docker exec -it my-postgres-container psql -U postgres

 

* POSTGRES_PASSWORD와 포트는 사용환경에 맞게 설정하시면 됩니다.

저는 테스트용이기에 1234로 작성했습니다

 

DB 접속

DBeaver를 실행하여 설치한 postgress DB에 접속이 잘 되는지 확인해보겠습니다.

 

 

 

접속이 잘 됩니다.

 

키워드 'with' 근처의 구문이 잘못되었습니다. 이 문이 공통 테이블 식이거나, xmlnamespaces 절이거나, 변경 내용 추적 컨텍스트 절인 경우에는 이전 문을 세미콜론으로 종료해야 합니다.

  MSSQL에서 임시테이블(with)쿼리를 작성하다보면 위와 같은 에러가 종종 발생합니다.

해결은 허무할 만큼 에러 메시지에 간단하게 나와있습니다

'With'앞에 세미콜론(;)만 붙여주면 됩니다.

-- WITH 앞에 세미콜론을 붙여주세요 --
;WITH '임시테이블명' AS (
			SELECT *
			  FROM	A   
			
			UNION ALL
			
			SELECT *			 
			  FROM	B
			 )
     select * from '임시테이블명'

  회사의 API서버가 무려 ASP CLASSIC으로 되어 있었습니다.

같은 서버에 다행히 PHP도 설치가 되어있어서, 서버 구성에 손대지 않고 API를 이 참에 다 갈아엎고자 PHP로 작업을 진행하고 있습니다.

 보통 mysql(maria db)과 많이 사용하여서 Mssql과 연동하는 작업은 전무했던터라 자주사용하는 소스를 공유드리고자 합니다.


1. DB 접속정보를 갖고 있는 config.php

 config.php를 생성하여 상수로 자주 사용할 정보들을 define 해줍니다.

<?php
	// IP는 예시이므로 사용하실 IP로 변경해주세요
    // DB 주소 (메인 DB와 테스트 DB를 사용)
    define('DB_MAIN','192.100.100.111');
    define('DB_TEST','192.100.100.112');

	// 데이터베이스 이름
    define('DB_EMPL','사원관리DB');
    define('DB_SALARY','급여관리DB');

	// DB 접속 정보
    define('DB_ID_ADMIN','id_admin');
    define('DB_PW_ADMIN','pw_admin');

	// 인코딩 
    define('DB_CHARACTERSET','UTF-8');

?>

2. config.php를 include 해주고 같은 경로에 select.php 라는 예제 파일을 아래와 같이 작성해보겠습니다.

각 코드별로 주석을 기재하였으나 어려우신 분들은 언제든 댓글 달아주세요 :)

<?php
    header('Content-Type: text/html; charset=utf-8');

    // 테스트할 때 모든 에러를 출력해주는게 좋습니다.
    error_reporting( E_ALL ); 
    ini_set( "display_errors", 1 );

    // DB 연결과 관련한 상수에 대한 값을 불러와줍니다.
    // 예를들어 select.php, update.php 등의 CRUD 작업페이지가 여러개라 할 때, DB의 접속 정보가 변경된 상황이 발생할 경우 
    // Config.php만 변경해주면 됩니다. 
    include 'config.php';
?>

<html>
    <head>
    <meta charset="utf-8">
    </head>

    <body>
        <?php
        // 연결할 MSSQL 서버에 대한 정보를 입력해줍니다.
        $serverName = DB_TEST;
        $connectionOptions = array(
            "database" => DB_EMPL,        // 데이터베이스명
            "uid" => DB_ID_ADMIN,             // 유저 아이디
            "pwd" => DB_PW_ADMIN,             // 유저 비번
            "CharacterSet" => DB_CHARACTERSET // 한글꺠짐 방지!
        );

        
        // --------------------------------------------------------------------
        // SQL 조건문에 변수를 넣을 경우 활용 하는 방법 
        // 1) 변수에 그대로 값 대입
        $F_EMPL_CODE = '사번';
        $F_START_DATE = '날짜';

        // 2) URL에 입력된 변수를 불러올 경우
        // 테스트는 GET / API 호출은 POST 사용
        // ex) http://localhost/select.php?EMPL_CODE=사번&START_DATE=데이타
        $F_EMPL_CODE = $_GET['F_EMPL_CODE'];
        $F_START_DATE = $_GET['F_START_DATE'];
        // --------------------------------------------------------------------

        // 결과값을 받을 변수
        $F_START_TIME = '';

        // DB 연결
        $dbconn = sqlsrv_connect($serverName, $connectionOptions); 
        // 연결 확인
        if ($dbconn) {
            echo "DB 연결 완료<br><hr>";
        }else{
            echo "DB 연결 실패<Br>";
            die( print_r( sqlsrv_errors(), true));
            echo "<hr>";
        }

        // 쿼리 작성
        $query = "SELECT * FROM 출근기록테이블
                WHERE 사번 = '$F_EMPL_CODE' and 날짜 = '$F_START_DATE'"; 

        // 쿼리를 실행하여 statement 를 얻어온다
        $params = array();
        $options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
        $stmt = sqlsrv_query($dbconn, $query, $params, $options );

        // 쿼리 결과 'row' 수를 반환해준다
        $row_count = sqlsrv_num_rows($stmt);
        
        // 결과가 1개 이상 있다면?
        if($row_count >= 1){
            // statement 를 돌면서 필드값을 가져온다
            while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))
            {   
                //  출력할 $row['컬럼명']; 형태로 출력해줌
                $F_START_TIME = (string) $row['근무시간'];
                echo $F_START_TIME."<Br>";
            }   
        }else{
            echo "조회된 정보가 없습니다";
        } 
        
        // 데이터 출력후 statement 를 해제한다
        sqlsrv_free_stmt($stmt);    

        // 데이터베이스 접속을 해제한다
        sqlsrv_close($dbconn);
        ?>
    </body>
</html>

 

개발환경

  • Windows10 OS
  • SSMS(SQL Server Management Studio) 14버전

 예를 들어서 '사원'의 정보를 갖고 있는 테이블이 있을 때, 사원 테이블에 select/Insert/delete/update 쿼리를 작성or테스트 할 경우가 발생한다.

 단순하겐 테이블의 속성들을 조회하여 일일이 쿼리문을 작성해주면 되지만 시간이 정말 오래걸릴 수도 있고 귀찮은 작업이 될 수 있지만 SSMS에서는 테이블 스크립팅 이라는 기능을 제공하여 테이블의 속성에 맞는 쿼리를 자동으로 생성해 주는 편리한 기능을 제공한다.

데이터베이스 > 테이블 > 작업할 테이블에서 마우스 우클릭 > 새 쿼리 편집기 창 클릭

위 화면 처럼 작업할 테이블을 마우스 우클릭으로 선택 > 테이블 스크립팅 메뉴에 마우스 오버를 해보면 작업할 쿼리를 선택할 수 있다.

개인적으로 insert와 update 쿼리를 자주 사용하는데 insert 테이블 스크립팅을 생성해보면

테이블 속성에 맞는 INSERT 문이 자동으로 생성된다

INSERT 쿼리 문이 생성되며 Values에 친절하게 데이터 타입도 명세되어있으며, 이 부분에 입력할 데이터만 작성해주면 된다

+ Recent posts