[데이터 엔지니어링] DB API

Colacan·2022년 5월 11일
1

DB API

DataBase Application Programming Interface의 약자

  1. Interface란 : 상호작용을 위해 만들어진 약속

  2. API : 개발기능을 위해서 사용자에게 제공하는 코드와 문서 같은 세트를 의미한다.

python dbapi

파이썬을 활용한 DB연결

  1. 파일형 데이터베이스인 sqlite, 서버형 데이터베이스인 PostgreSQL 와 연결

PEP 249

DBAPI v2.0에 대한 문서

  1. 파이썬은 DB와 연결하는 파이썬 모듈들을 가이드라인을 따라 제작되도록 안내한다. (함수,메소드,파라미터,키워드등)

  2. 가이드라인 덕분에 동일한 API로 다양한 데이터베이스 이용가능

  3. PEP는 파이썬이 향상되기 위한 제안들이다.

SQLite

파이썬과 함께 설치되는 가벼운 파일형 관계형 DB

  1. 서버형 DB에 비해 기능이 제한적이다. (기능적 제한으로 고급쿼리등은 실행하기 어렵다)

  2. 파일형이므로 실행중인 프로그램의 메모리에 상주할 수 있기에 삭제나 프로세스 종료로 인한 데이터 손실도 생긴다.

  3. 간단하게 DB를 구축하거나 단순한 실험하기에는 좋다.

SQLite 이용

파이썬 2.5x 이후로 기본적으로 설치되는 모듈인 sqlite3를 이용한다.

  1. SQLite 데이터베이스 연결
    connect 메소드를 이용해 DB파일의 위치를 알려준다.
import sqlite3
conn = sqlite3.connect('test.db')
  1. DB파일이 없으면 데이터베이스와 연결한다.
    1) 일반적으로 디스크파일에 저장되지만 아래 코드처럼 메모리에서도 실행가능하다.
    2) 이 때 이용하는 파일명의 확장자는 .db, .sqlite3등이 있다.
    3) conn은 DB와 연결된 하나의 세션을 보관한다.
import sqlite3
conn = sqlite3.connect(':memory:')
  1. 세션을 통해 DB와 소통하기 위해서는 cursor가 필요하다
cur = conn.cursor()
  1. 커서메소드 execute 이용
    가장 기본적인 데이터 베이스 소통방식, 메소드의 인수로 SQL 쿼리문을 바로 넘겨줄 수 있다.
cur.execute("""CREATE TABLE test_table (
				name VARCHAR(32),
				age INT);
			""")
# 여러개의 레코드 추가할때는 아래 같은 코드 사용가능
cur.execute("INSERT INTO test_table (name, age) VALUES (?, ?)",(name,age)))
users = [('lemon', 10),
         ('apple', 15)]
for user in users:
    cur.execute("INSERT INTO test_table (name, age) VALUES (?, ?);", user
  1. 위의 과정들이 끝난뒤 DB에 입력
    1) con.commit : 현재 트랜잭션을 커밋한다. 호출되지 않으면 마지막 commit()이후에 수행한 작업은 볼 수 없다.
    2) commit 은 데이터베이스 연결에 대한 Connection 객체를 통해 사용가능하다.
    3) type(conn) : class 'sqlite3.connect({DB이름})으로 나타난다.

  2. cursor.fetchone, cursor.fetchall
    추가한 데이터를 조회한다.
    1) 아래와 같은 코드만 실행하면 데이터를 조회할 수 없다.
    2) fetchone, fetchmany, fetchall를 추가적으로 실행해서 가져올 수 있다.
    3) 두번째 코드는 리스트 형식으로 쿼리를 통해 실행된 결과를 리턴한다.
    4) fetchone을 통해 연속으로 데이터를 조회하면 레코드 순서대로 데이터가 출력된다.

cur.execute("SELECT * FROM test_table;")
cur.fetchall()
  1. 문제발생 경우
    sqlite3 공식문서를 이용해서 문제를 해결하자.

온프레미스

원격이 아닌 직접 설치해 운영하는 방식을 뜻한다.

  1. 대부분의 클라우드서버는 온프레미스 방식보다 관리비용이 적게 들어간다.

  2. 하지만 정보보안 속도를 위해 온프레미스 방식이 활용되기도 한다.

클라우드 데이터베이스

원격으로 관리되는 데이터베이스이다.

  1. 접근할 때 DB에 대한 접근정보가 있어야한다.

  2. 여러명이 접속할 수 있기에 협업등에 이용가능하다.

  3. 보안, 서버이용비용, 서버 에러 생길시 직접적인 해결불가하다.

URI

보통 원격으로 연결할때 이용하는 형식

  1. 논리적 혹은 물리적 리소스를 찾을 때 사용

  2. 네트워크에서 정보를 찾거나 받아올 때도 사용가능하다.

  3. URI는 (서비스://유저이름:유저비밀번호@호스트:포트번호/경로 혹은 데이터베이스 이름) 의 형식으로 이루어진다.

  4. URL은 URI의 하위계층이다.

ElephantSQL

서비스는 제한적이지만 무료로 클라우드 postgres 데이터베이스를 제공한다.
(elephantSQL무료버전은 동시실행 connection수가 제한되어있으니 유의)

  1. url 로 접속해도 괜찮고 직접 서버, 데이터베이스, 유저, 비밀번호 등을 입력해서 접속해도 동일하다.

  2. ElephantSQL 연결
    1) PC의 주소에 연결된 프로그램마다 지정된 포트번호가 다르다.
    2) 일반적으로 postgreSQL은 5432포트를 이용한다.

PostgreSQL

객체-관계형 데이터베이스 관리 시스템

  1. Postgre 연결
    Postgre의 서버는 클라우드 데이터베이스에서 생성한 elephantDB 를 대상으로 한다.

  2. 설치
    데이터베이스에 맞는 파이썬 라이브러리의 설치가 필요하다. (Postgre 와 같은 경우에는 psycopg2 를 설치)
    1) pip install psycopg2 가 제대로 동작하지 않을경우 pip install psycopg2-binary를 이용

  3. 데이터베이스 연결
    1) sqlite3 보다 설정이 조금 더 있다.
    2) 데이터베이스 서버 주소, 유저 이름, 비밀번호, 포트번호를 설정해야한다.
    3) 코드를 작성할시 DB와 연결된다.
    4) 이후의 상호작용은 동일하다.
    5) postgreSQL 에서는 SQLite의 ?대신 %s를 이용하므로 주의

import psycopg2
conn = psycopg2.connect(
    host="서버 호스트 주소",
    database="데이터베이스 이름",
    user="유저 이름",
    password="유저 비밀번호")
profile
For DE, DA / There is no royal road to learning

0개의 댓글