파이썬 구글 시트 DB처럼 사용하기

파이썬 구글 시트 DB처럼 사용하기

baealex

소비적인 일보단 생산적인 일을 좋아합니다.

Sign in to view email

필자가 제작중인 노션 도우미에는 익명 댓글 시스템이 존재한다. 이 데이터들을 최대한 안전하고 간편하게 보관할 수 있는 방법을 모색하고 있었다. 깃헙에 올릴까? S3를 사용할까? 노션 자체에 이 기록을 올리게 할 순 없을까? 등등을 고민하다가 각 방법들이 완벽한 해결방법은 아니어서 적용하긴 어려움이 있었다.

어느날 어떤 프로그램(오렌지3)에서 구글 스프레드시트를 읽어오는 것을 봤는데 설마 구글 스프레드시트 API가 존재하는 것인지 찾아보았다. 아주 잘 계시더라. 스프레드시트 자체가 DB와 형태가 유사하므로 충분히 활용하면 스프레드시트를 DB대신 사용할 수 있을거라 생각했다. 물론 여기서는 완전하게 DB를 대체할 수 있는 수준으로 주제를 다루진 않는다.

사용한 라이브러리 : https://github.com/burnash/gspread


목표

  • 원하는 키가 있는 행의 데이터 가져오기
  • 원하는 키가 없으면 새로운 행 만들기


선행작업

  1. 구글 클라우드 플랫폼 콘솔에서 새로운 프로젝트 생성
  2. JSON 키 생성 (key.json으로 저장)
  3. Drive API, Sheet API 활성화
  4. Sheet 에서 키에 나열된 client_email과 Sheet 공유


작업시작

pip install gspread
import gspread

gc = gspread.service_account(filename='key.json')
sh = gc.open('<Sheet Title>')

# 워크 시트를 선택하는 방법
worksheet = sh.sheet1
worksheet = sh.worksheet("<Work Sheet Title>")

# 특정 값 가져오기
print(sh.sheet1.get('A1'))

sh의 public 멤버

'add_worksheet', 'batch_update', 'client', 'del_worksheet', 'duplicate_sheet', 'fetch_sheet_metadata', 'get_worksheet', 'id', 'list_permissions', 'remove_permissions', 'reorder_worksheets', 'share', 'sheet1', 'title', 'updated', 'url', 'values_append', 'values_batch_get', 'values_batch_update', 'values_clear', 'values_get', 'values_update', 'worksheet', 'worksheets'


원하는 키가 있는 행

우선 특정 값을 찾아보자.

value = worksheet.find("<Value>")

value라는 녀석의 public 멤버는 다음과 같다.

'address', 'col', 'from_address', 'input_value', 'numeric_value', 'row', 'value'

위 멤버 메서드/변수에서 row를 찍어보면 해당 값의 행이 출력된다.

values_list = worksheet.row_values(worksheet.find("<Value>").row)

그럼 위와같이 <Value>로 특정 키를 호출한다고 가정하면 해당 키가 존재하는 행을 가져올거다.


업데이트 / 삽입

업데이트

해당 키의 값을 업데이트 하고자 한다면?

worksheet.update('B1', '<Value>')

위와같이 첫번째 인자에는 행열의 위치를 지정하는데 나 같은 경우엔 소스코드에서 딕셔너리로 열에 대한 정보를 만들어 놓았다.

col = {
    'key': 'A',
    'value': 'B'
}

worksheet.update(col['value'] + str(t.row), '<Value>')

삽입

worksheet.insert_row(['<Value>', '<Value>'])

insert_row 메서드를 사용하면 0번 행에 값을 추가한다. 0번 행은 구분 값으로 사용하려던터라 마지막 행에 넣는 방법을 찾고자 하였으나 구분값을 굳이 사용하지 않는다면 활용성이 높을 것으로 보인다.

여하튼 값을 찾을 때 값이 없으면 새로운 행을 삽입하는 코드는 아래처럼 작성할 수 있겠다.

find_row = None
try:
    find_row = worksheet.find("<Value>")
except:
    worksheet.insert_row(['<Value>', '<Value>'])


작성된 댓글이 없습니다!
로그인된 사용자만 댓글을 작성할 수 있습니다.