본문 바로가기
코딩 연습

파이썬 장고에서 db table에 직접 접속하는 파일(.py) 만들기

by good4me 2022. 6. 23.

goodthings4me.tistory.com

파이썬 장고를 사용해서 특정 데이터의 테이블을 만들고 데이터를 넣은 후 웹에서 간단하게 조회하는 기능을 만들면서 데이터베이스와 테이블에 접근할 수 있는 방법(장고의 파일(.py)에서 코딩으로 직접 접속)을 알게 되어 활용 후 정리함

 

 

장고(Django)에서 sqlite3에 직접 접근하는 파일 만들기

  • 아래와 같이 관련 모듈을 import 하면 장고 내에서 Models 클래스로 만든 sqlite3 DB와 table을 사용할 수 있다.
  • 단, 이때 사용하는 쿼리문은 장고 템플릿 문법이다.
  • 모델 클래스에서 속성(컬럼) 추가 후 migrate 하고, 관련 컬럼을 update 시키려고 할 때 유용할 것으로 생각된다.(모델 클래스 속성(컬럼) 추가 후 1번 선택 후 >>> 에서 0 입력하고 업데이트 진행 시)

※ 아래 예시에서,

장고의 models.py에서 Model 클래스 이름은 Jusotb이며, 속성(table 컬럼)은 sido, sigungu, dong, bldname으로 했다.

[파이썬 소스 코드]

## 사용해야 할 모듈을 import 한다.
## 아래 4개 코드는 필수!! (*config.settings에서 config는 프로젝트 내 config 폴더)
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
import django
django.setup()

from jusodata.models import Jusotb
from django.db.models import Q

# juso_list = Jusotb.objects.filter(Q(sido = '서울특별시') &  Q(dong = '성북동') & Q(bldname = '서울아파트'))
# juso_list = Jusotb.objects.filter(bldname="서울아파트")
juso_list = Jusotb.objects.all()

juso_list_cnt = juso_list.count()
print(type(juso_list), juso_list_cnt)

cnt = 10000001  # 관리번호 시작번호
idx = 1  # id count
for row in juso_list:
    apt_no = 'a' + str(cnt)
    
    Jusotb.objects.filter(id=idx).update(aptno=apt_no)
    # 업데이트 쿼리문 예시) Jusotb.objects.filter(id=3072412).update(aptno='10')

    # print(row.id, row.bldname, row.aptno)
    cnt += 1
    idx += 1
    print(f'cnt:{cnt} / idx: {idx}')

    # if cnt == 10001000:  # 테스트로 1000개만 실행
    #     break

 

 

▶ 실제 코딩 중에 관리번호 필드를 추가(문자+숫자인 A10000001) 후에 생각해보니 해당 db 테이블의 컬럼에 Row를 추가할 때마다 +1 증가시켜야 하는 문제가 있었다. 

def jusodata_write(request):
    juso = Jusogokr.objects.last()  # 맨 마지막 Row. 맨 처음은 objects.first()
    print(juso.mng_no)  # 관리번호 마지막 번호
    manage_no = ''
    if juso:
        manage_no = 'a' + str(int(juso.mng_no[1:]) + 1)
        # a10000001 slice 후 +1 하고 다시 문자로 결합
    else:
        manage_no = 'a10000001'  # 처음일 경우
        
    if request.method == 'POST':
        form = JusoForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('juso:write')
    else:
        form = JusoForm()
        # for key in form.fields:  # form.fields : 컬럼값들임
        #     print(key)
            
        ## 관리번호를 자동으로 +1 증가값으로 form에 전달하기
        ## 입력할 때 readonly 속성이라서 해당 컬험 속성값을 자동으로 할당해야함 
        form.fields['mng_no'].widget.attrs['value'] = manage_no
        
    context = {
        'form': form
    }
    return render(request, 'jusodata/jusodata_write.html', context)

 

good4me.co.kr

 

 

 

댓글