Django DB migration

kangjuju·2023년 4월 19일
0

Django

목록 보기
3/6
  • Django에서 DB를 운용해보자.
    + remoteDB
    + localDB

local DB

Model은 데이터 서비스를 제공하는 Layer이다.

Django의 Model은 각 Django App안에 기본적으로 생성되는 models.py 모듈 안에 정의하게 된다.
models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 데이타베이스에서 하나의 테이블에 해당된다.

class Article(models.Model):
    code = models.CharField(max_length=10)
    name = models.CharField(max_length=20)
    price = models.IntegerField()
    pub_date = models.DateTimeField()

이렇게 정의한 모델 class를 물리적인 테이블 생성을 위해
더 구체적으로 정의하기위해 migration한다.
프로젝트를 Make migration하고 선택할 App명을 작성한다.
그후 migrate 한다.

django admin

django는 관리자 화면을 지원한다.

프롬프트에서 프로젝트 경로로 이동하고

>python manage.py createsuperuser

아이디와 이메일, 비밀번호를 지정한다.
그 후 localhost/admin으로 접속하여 로그인.

관리자 창에서 CRUD를 하고싶다면 admin.py 에서 정의하면 된다.

admin.py

# admin.ModelAdmin 상속
class ArticleAdmin(admin.ModelAdmin):
    #보이고 싶은 내용을 tuple로
    list_display = ('id','code','name','price','pub_date')
    
admin.site.register(Article,ArticleAdmin)

Article ORM출력

django의 select return set은 QuerySet이다.
쿼리셋(QuerySet)은 전달받은 모델의 객체 목록.
쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있다.

views , html

#select
def DataShow(request):
    datas = Article.objects.all() #ORM으로 select문 수행
    return render(request, 'list.html',{'articles':datas})
<body>
{% if articles.count > 0 %}
	{% for a in articles %}
		<b>{{a.code}}</b> {{a.name}} {{a.price}} {{a.pub_date}}<br>
	{% endfor %}
{% else %}
	자료가 없습니다
{% endif %}
</body>

remoteDB

  • mariaDB 사용

1. settings 파일 관련 설정
settings -DATABASES 내용변경

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'guestdb', #DB명 : db는 미리 작성되어 있어야 함.  
        'USER': 'root',        
        'PASSWORD': '~~',
        'HOST': '127.0.0.21',
        'PORT': '3306',
    }
}
  1. models.py
class Guest(models.Model):
    # myno = models.AutoField(auto_created=True,primary_key=True) #자동생성id 대체
    title = models.CharField(max_length=50) #varchar 컬럼추가
    content = models.TextField()
    regdate = models.DateTimeField()
    
      class Meta: # 정렬 Meta정보 삽입가능
      ordering = ('-id',) #tuple!
  1. make migration -> migrate (여기서 실질적인 테이블이 생성됨.)
  1. admin.py
class GuestAdmin(admin.ModelAdmin):
    list_display = ('id','title','content','regdate') #컬럼명
    
admin.site.register(Guest,GuestAdmin)
  1. python manage.py createsuperuser 계정 생성.

  2. admin페이지 로그인 후 CRUD. mariadb와 연동이 완료되었다

DB CRUD

remoteDB - insert views.py

  • insert요청을 받음
  • 요청방식에 의한 분기로 한번에 작성함.
  • POST로 받은 form내용을 insert
def InsertFunc(request):
    if request.method == 'GET':
        return render(request, 'insert.html')
        
    elif request.method == 'POST': #submit
        Guest( #DB
            title = request.POST.get('title'),
            content = request.POST.get('content'),
            regdate = datetime.now()
            #regdate = timezone.now()
        ).save()
        #get으로 다시 요청해야함. forward X
        return HttpResponseRedirect('/guest') 

수정,삭제

# 수정 Update
 g = Guest.objects.get(id=id번호)
 g.title = request.POST.get('title')
 g.title = request.POST.get('content')
 g.save()


# 삭제 Delete
g = Guest.objects.get(id=id번호)
g.delete()

참고

QuerySet Method

  • localDB Article 관련 함수
    #where + groupby 조건 filter [where name = '마우스']
    print(Article.objects.filter(name='마우스').aggregate(Avg('price')))
    # NOT IN
    print(Article.objects.exclude(name='마우스').aggregate(Avg('price')))
    # distinct
    print(Article.objects.values(name='마우스').distinct())
    # filter 복수의 값을 반환 (QuerySet)
    print(Guest.objects.filter(title__contains='title test2')) #LIKE
    print(Guest.objects.filter(title='title test1')) #==
    print(Guest.objects.filter(id = 1))
    # get 1개만 반환
    print(Guest.objects.get(id = 1))
    #sort
    gdata = Guest.objects.all().order_by('-id','date') # desc / asc 순 
    # ...

레이아웃

layout.html을 따로 만들어 작성한다.
<div style="color:blue">
{% block content %}
{% endblock %}
</div>
<hr>
바닥글------

대상 html에 block을 추가한다.

<body>
{% extends 'layout.html' %}
{% block content %}

~~내용~~

{% endblock %}
</body>

values_list()

  • 쿼리셋 속 값을 사용하고싶을때
def List2(request):
    products = Product.objects.all()
    print(products.values_list())
    for row in products.values_list():
        print(row)
    return render(request, 'list2.html',{'products':products,'pcount':len(products)})

0개의 댓글