[Postgres] pymysql과 psycopg2-binary차이

hugingstar·2025년 12월 4일

DevOps

목록 보기
13/14
post-thumbnail
  • 데이터베이스를 변경하는 과정에서 같은 관계형 DB라고 하더라고 코드 부분에서도 미묘한 차이점을 확인해야한다.

1. 설치

pip install pymysql

pip install psycopg2-binary

2. MySQL과 Postgres 차이점

  • pymysql.connect 모듈에 접속 정보를 입력한다.
  • pymysql은 데이터베이스를 먼저 선언 안하고 해도 무방하기 때문에 CREATE IF NOT EXIST 구분을 사용해서 쿼리에서 처리해줬다.
import pymysql

class CreateDatabase():
    def __init__(self, host, port, user, password, db_name):
        """
        데이터베이스 생성
        New database will be created.
        :param host: IP
        :param port: Port
        :param user: root
        :param password: password of connection
        :param db_name: the name of database
        """
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.db_name = db_name

        try:
            # MySQL
            self.conn = pymysql.connect(
                host=self.host,
                port=self.port,
                user=self.user,
                password=self.password)

            # Cursor
            with self.conn.cursor() as cursor:
                # SQL Sentence
                create_table_query = """
                CREATE DATABASE IF NOT EXISTS {};
                """.format(self.db_name)

                # Result
                cursor.execute(create_table_query)
                self.conn.commit()
                print(f"Database '{self.db_name}' created or already exists.")

        except Exception as e:
            print("Error while creating database:", e)

        self.conn.close()


if __name__ == '__main__':
    CreateDatabase(
        host=localhost,
        port=3306,
        user="root",
        password="password",
        db_name="dbname"
        )
  • psycopg2.connect 모듈에 접속 정보를 입력한다.
  • psycopg2는 default_db에 먼저 접속을 하고, 내부에 데이터베이스가 있는지 없는지를 확인한 후에 생성해야 한다.
import psycopg2
from psycopg2 import sql, errors

class CreateDatabase:
    def __init__(self, host, port, user, password, db_name, default_db_name="postgres"):
        """
        :param host: IP
        :param port: Port (PostgreSQL 기본값: 5432)
        :param user: 사용자 이름 (일반적으로 'postgres')
        :param password: 연결 비밀번호
        :param db_name: 새로 생성할 데이터베이스의 이름
        """
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.db_name = db_name

        self.default_db_name = default_db_name
        self.conn = None

        try:
            self.conn = psycopg2.connect(
                host=self.host,
                port=self.port,
                user=self.user,
                password=self.password,
                database=self.default_db_name
            )
            # 자동 커밋 모드
            self.conn.autocommit = True 

            with self.conn.cursor() as cursor:
                create_db_query = sql.SQL("CREATE DATABASE {}").format(
                    sql.Identifier(self.db_name)
                )

                # 3. 쿼리 실행
                try:
                    cursor.execute(create_db_query)
                    print(f"Database '{self.db_name}' successfully created.")
                
                except errors.DuplicateDatabase:
                    # 이미 존재하는 경우
                    print(f"Database '{self.db_name}' already exists.")
                
                except Exception as e:
                    # 다른 예외 발생 시 처리
                    print(f"Error while creating database: {e}")

        except Exception as e:
            # 초기 연결 실패 시 처리
            print(f"Error connecting to PostgreSQL server: {e}")

        finally:
            # 연결이 성공적으로 이루어졌다면 닫습니다.
            if self.conn:
                self.conn.close()


if __name__ == '__main__':
    CreateDatabase(
        host="127.0.0.1",
        port=5435,
        user="root", 
        password="password", 
        db_name="생성할 DB 이름",
        default_db_name="postgres"
    )

0개의 댓글