본문 바로가기

Python/Django

[파이썬] DB 연동하기 (Remote)

 

Django를 사용하여 원격 데이터베이스에 연결하는 방법에는 원격 데이터베이스에 데이터를 추가하고 이용하는 방법과

이미 있는 데이터베이스에서 데이터를 불러오는 방식 이 두가지가 있습니다.

이 포스팅에서는 전자의 방식에 대해서 설명해보도록 하겠습니다.

 

저같은 경우는 eclipse에서 mariadb를 활용하고 있기에 Pydev Django Project를 형성시, 기본적으로 생성되는 settings.py에 데이터베이스 구성을 변경해주었습니다. 

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "사용하고자 하는 데이터베이스",
        'USER': '사용자이름',
        'PASSWORD': '사용자패스워드', 
        'HOST': 'localhost',
        'PORT': ''
    }
}

 

다른 RDBMS를 사용하고 계시다면 Django 홈페이지에 들어가서 그에 맞는 databases 구성을 가져오시면 됩니다.

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

이번 포스팅에서는 원격데이터베이스를 활용하여,

list형식으로 데이터를 보는 방식을 보여드리겠습니다.

저는 사용 데이터베이스는 familydb로 하였습니다.

 

먼저 원격으로 데이터베이스를 만들기 위해, 사용자가 만든 app에서

models.py에 모델을 생성합니다.

from django.db import models

# Create your models here.
class Family(models.Model):
    name=models.CharField(max_length=20)
    age=models.IntegerField()
    tel=models.CharField(max_length=13)
    gen=models.CharField(max_length=5)
    
def __str__(self):
    return self.name

 

그 후 migrations를 생성하면,

# Generated by Django 4.2.6 on 2023-10-23 09:05

from django.db import migrations, models


class Migration(migrations.Migration):
    initial = True

    dependencies = []

    operations = [
        migrations.CreateModel(
            name="Family",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("name", models.CharField(max_length=20)),
                ("age", models.IntegerField()),
                ("tel", models.CharField(max_length=13)),
                ("gen", models.CharField(max_length=5)),
            ],
        ),
    ]

models에서 지정해준 대로 테이블 및 칼럼들이 생성됩니다.

 

그 후 migrate를 해줄시, 사용하는 데이터베이스에 밑처럼 장고에서 자동적으로 생성해주는 테이블들이 여러개로 나오는데, 저희가 만든 테이블의 경우 가장 밑에 있는 pro11app_family입니다.

 

 

그 후 아나콘다 프롬프트를 열어, 관리자 설정을 해줍니다.

반드시 그 파일이 있는 곳으로 파일 위치를 지정해준 후 실행해야 합니다.

 

그런 다음 admin.py에 모델을 등록합니다.

from django.contrib import admin
from pro11app.models import Family

# Register your models here.
class FamilyAdmin(admin.ModelAdmin):
    list_display=('id','name','age','tel','gen')
    
admin.site.register(Family, FamilyAdmin)

 

이런 후 서버를 실행시켜 localhost/admin으로 이동시 

등록해준 모델이 뜨고,

원하는 값을 추가할 수 있습니다.

 

 

원하는 값을 추가하고 mariadb 프롬프트에서 확인해볼시,

생성이 완료됩니다.

 

그리고 웹에서 테이블을 보기위해 views파일을 작성합니다.

def ListFunc(request):
    fdatas = Family.objects.all()
    total = len(fdatas)
    sum_age = sum(int(f.age) for f in fdatas)
    avg_age = sum_age / total if total > 0 else 0
    return render(request, 'list.html', {'fdatas':fdatas, 'total':total, 'avg_age':avg_age})

 

그 후 파일을 연결시키기위해

application에서 pydev module을 urls.py로 생성하여 경로를 연결시켜줍니다.

from django.urls import path
from pro11app import views
from django.urls.conf import include


urlpatterns = [

    path('select', views.ListFunc),  
    path('',include('family'))
]

 

그리고 프로젝트의 url.py에서 앱의 URL을 포함합니다.

from django.contrib import admin
from django.urls import path
from pro11app import views


urlpatterns = [
    path("admin/", admin.site.urls),
    path('', views.ListFunc,name='family'),
]

 

 

마지막으로 템플릿을 작성해주면 됩니다.

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
</head>

<body>
	<!-- guest의 select요청을 통해 들어온 페이지-->
	** 글 목록 **
	<p />
	<table border="1">
		<tr>
			<th>번 호</th>
			<th>이 름</th>
			<th>나 이</th>
			<th>전 화</th>
			<th>성 별</th>
		</tr>
		{% if fdatas %}
		{% for f in fdatas %}
		<tr>
			<td>{{f.id}}</td>
			<td>{{f.name}}</td>
			<td>{{ f.age }}</td>
			<td>{{f.tel}}</td>
			<td>{{f.gen}}</td>
		</tr>
		{% endfor %}
		<tr>
			<td colspan="5">
				인원수 : {{total}}명
			</td>
		</tr>
		<tr>
			<td colspan="5">
				나이평균 : {{avg_age}}
			</td>
		</tr>
		{% else %}
		<tr>
			<td colspan='5'>자료 없음</td>
		</tr>
		{% endif %}

	</table>

</body>

</html>

 

 

실행 결과입니다.