DBAPIs and psycopg2

rang-dev·2020년 3월 17일
0

DBAPI

  • 데이터베이스와 상호작용하고 그 결과를 특정 언어(ex. Ruby, Python, Javascript 등)를 이용하여 사용할 수 있다.
  • 데이터베이스 어댑터라고 부르기도 한다.
  • 모든 서버 프레임워크나 언어 + 데이터베이스 시스템에 따라 다른 DBAPI들이 존재한다.



psycopg2

  • Python에 사용되는 DBAPI이다.



Basic Usage

import psycopg2

## 데이터베이스와 연결
connection = psycopg2.connect('dbname=example', password = '*****')


## open session -- start transactions
## the cursor is offered by the connection object as a result of connectiong to psycopg2
cursor = connection.cursor()

## cursor is an interface that allows you to start queuing up work and transactions.
cursor.execute('''
CREATE TABLE table2 (
    id INTEGER PRIMARY KEY,
    completed BOOLEAN NOT NULL DEFAULT False
);
''')


cursor.execute('INSERT INTO table2 (id, completed) VALUES (1, true);')

## 만들었던 트랜젝션들을 커밋함
connection.commit()

## 더이상 트랜잭션을 만들지 않고 커밋하고 싶지 않다면
connection.close()
cursor.close()


String Composition

# ## version1. Using %s, passing in a tuple as the 2nd argument in cusror.execute()
# cursor.execute('INSERT INTO table2 (id, completed) VALUES (%s, %s);', (1, True))


# ## version2. Using named string parameters %(foo)s, passing in a dictionary instead.
# cursor.execute('INSERT INTO table2 (id, completed) VALUES (%(id)s, %(completed)s);',
# {'id': 4, 'completed': False}
# )

## imporve code quality
SQL = 'INSERT INTO table2 (id, completed) VALUES (%(id)s, %(completed)s);'
data = {'id': 4, 'completed': False}
cursor.execute(SQL, data)


Fetching Results

Fetch: Retrieving data and then moving it to an alternate location or displaying it.


cursor.execute('SELECT * from table2;')

# result = cursor.fetchall()
# print('fetchall', result)

result = cursor.fetchmany(2)
print('fetchmany', result)

result2 = cursor.fetchone()
print('fetchone', result2)

result3 = cursor.fetchone()
print('fetchone', result3)

주의할점: fetch를 할 때에는 바로 전에 execute한 결과만을 가져온다. 만약 레코드가 3개 있다고 했을 때 위의 코드를 실행하면

fetchmany [(1, True), (4, False)]
fetchone (3, True)
fetchone None

이와 같은 결과가 나오고 만약 마지막 .fetchone()을 하기 바로 전에 select * from table2를 한번 더 .execute()했다면

fetchmany [(1, True), (4, False)]
fetchone (3, True)
fetchone (1, True)

이와 같은 결과가 나온다.



psycopg2 commands

  • conn = psycopg2.connect(...)

    • establish a connection, starting a session, begins a transaction
  • cursor = conn.cursor()

    • Sets a cursor to begin executing commands
  • cursor.execute()

  • cursor.commit()

    • commit the transaction (not done actomatically)
  • cursor.rollback()

    • rollback the transaction
  • cursor.fetchall()

  • cursor.fetchmany(3)

  • cursor.fetchone()

    • fetches the first result in the result set
  • cursor.close()

  • conn.close()

    • close the connection (not done actomatically)
profile
지금 있는 곳에서, 내가 가진 것으로, 할 수 있는 일을 하기 🐢

0개의 댓글