psycopg2 라이브러리
기본 사용법
1
pip install psycopg2-binary
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import psycopg2
# 1. 데이터베이스 연결 정보 설정
# 실제 환경에 맞게 'host', 'database', 'user', 'password', 'port'를 변경한다.
DB_HOST = "localhost"
DB_NAME = "your_database_name"
DB_USER = "your_user"
DB_PASS = "your_password"
DB_PORT = 5432
conn = None # 연결 객체 초기화
try:
# 1. 연결 설정
conn = psycopg2.connect(
host=DB_HOST,
database=DB_NAME,
user=DB_USER,
password=DB_PASS,
port=DB_PORT
)
# 2. 커서 생성
cur = conn.cursor()
# 테이블 생성 예시 (데이터 변경 작업)
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);
""")
# 데이터 삽입 예시 (파라미터화된 쿼리 사용 권장 - SQL 인젝션 방지)
user_data = ("Alice", "alice@example.com")
cur.execute("INSERT INTO users (name, email) VALUES (%s, %s)", user_data)
# 4. 변경 사항 확정 (Commit)
conn.commit()
print("데이터 삽입 성공!")
# 데이터 조회 예시 (SELECT 쿼리)
cur.execute("SELECT id, name, email FROM users WHERE name = %s", ("Alice",))
# 쿼리 결과 가져오기
# fetchone(): 하나의 결과만 가져옴
# fetchall(): 모든 결과를 리스트의 튜플 형태로 가져옴
# fetchmany(size): 지정된 개수만큼 가져옴
rows = cur.fetchall()
print("\n--- 조회 결과 ---")
for row in rows:
print(f"ID: {row[0]}, 이름: {row[1]}, 이메일: {row[2]}")
# 5. 커서 닫기
cur.close()
except (Exception, psycopg2.Error) as error:
print(f"PostgreSQL 연결 또는 쿼리 실행 중 오류 발생: {error}")
finally:
# 5. 연결 닫기 (오류 발생 여부와 관계없이 실행)
if conn is not None:
conn.close()
print("\nPostgreSQL 연결이 닫혔습니다.")
pandas to_sql()
- pandas 의
to_sql()메서드를 이용해 데이터프레임 단위로 적재를 할 수 있따. to_sql()함수를 사용하려면 데이터베이스 연결이 필요하다.
1
pip install pandas sqlalchemy psycopg2-binary
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import pandas as pd
from sqlalchemy import create_engine
import psycopg2 # 연결 드라이버로 사용
# 1. 데이터프레임 준비 (테이블과 동일한 구조라고 가정)
data = {
'id': [1, 2, 3],
'name': ['김철수', '이영희', '박민수'],
'email': ['cs@example.com', 'yh@example.com', 'ms@example.com'],
'age': [30, 25, 35]
}
df = pd.DataFrame(data)
# 2. PostgreSQL 연결 엔진 생성
# 형식: 'postgresql+psycopg2://<user>:<password>@<host>:<port>/<database>'
DB_USER = "your_user"
DB_PASS = "your_password"
DB_HOST = "localhost"
DB_PORT = 5432
DB_NAME = "your_database_name"
TABLE_NAME = "users" # 데이터프레임을 저장할 테이블 이름
engine_url = f"postgresql+psycopg2://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
try:
# SQLAlchemy 엔진 생성
engine = create_engine(engine_url)
# 3. 데이터프레임을 SQL 테이블로 적재
# name: 저장할 테이블 이름
# con: 연결 엔진
# if_exists: 테이블이 이미 존재할 경우 처리 방식 ('fail', 'replace', 'append')
# index: DataFrame의 인덱스를 테이블의 컬럼으로 저장할지 여부
df.to_sql(
name=TABLE_NAME,
con=engine,
if_exists='append', # 'append'는 기존 테이블에 데이터 추가
index=False, # DataFrame의 인덱스를 저장하지 않음
method='multi' # 여러 행을 한 번에 삽입하여 성능 향상
)
print(f"DataFrame이 '{TABLE_NAME}' 테이블에 적재 성공.")
except Exception as e:
print(f"데이터 적재 중 오류 발생: {e}")
Comments