Django ORM์ด๋?
Django ORM์ด๋ Object Relational Mapping์ ์ค์๋ง์ด๋ฉฐ ๊ฐ์ฒด(Object)์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Relational)์ ์ฐ๊ฒฐ(Mapping) ํด์ค๋ค๋ ๋ป์ด๋ค.
์์ ๋ง๋ง ๋ค์ด์๋ Django ORM์ด๋ผ๋ ๊ฒ์ด ์ ์๋ฟ์ง ์๋๋ค. ์กฐ๊ธ ํ์ด์ ์ค๋ช ํ๋ค๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์์ค๊ธฐ ์ํด์๋ ์๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํด์ผ ํ์๋ค. ๊ทธ๋ฐ๋ฐ Django ORM์ ์ฌ์ฉํ๋ค๋ฉด ์ฟผ๋ฆฌ๋ฌธ ์์ด ํ์ด์ฌ ์ฝ๋๋ง์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ์ ์๋ค!
์๋ฅผ ๋ค์ด๋ณด์.
from django.db import models
class User(models.Model):
name = models.CharField(max_length=45)
email = models.CharField(max_length=100, unique=True)
password = models.CharField(max_length=200)
class Meta:
db_table = 'users'
์์ ๊ฐ์ model์ django์ ์ด์ฉํ์ฌ migrate ํ๋ฉด
mysql> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| name | varchar(45) | NO | | NULL | |
| email | varchar(100) | NO | UNI | NULL | |
| password | varchar(200) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
์์ ๊ฐ์ ํ ์ด๋ธ์ด ์์ฑ๋๋ค.
์ด๋ ๊ฒ ํ์ด์ฌ ์ฝ๋๋ง์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ์ํ๋ ํ ์ด๋ธ์ ์์ฑํ ์ ์๋ค.
์ django ๋ชจ๋ธ์ ์์ฑํ ์ฝ๋๋ ์๋ SQL ๋ฌธ์ผ๋ก ์์ฑํด์ผ๋ง ํ๋ ๊ฒ์ด๋ค. ์ ํ์ด์ฌ ์ฝ๋๋ฅผ SQL๋ฌธ์ผ๋ก ๋ฐ๊ฟ๋ณธ๋ค๋ฉด
mysql> CREATE TABLE users2 (
-> id BIGINT NOT NULL PRIMARY KEY,
-> name VARCHAR(45),
-> email VARCHAR(100) UNIQUE,
-> password VARCHAR(200)
-> );
Query OK, 0 rows affected (0.01 sec)
์์ ๊ฐ์ด CREATE TABLE์ ์ด์ฉํ์ฌ ์ง์ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ํ ์ด๋ธ์ ์์ฑํ์ฌ์ผํ๋ค.
mysql> desc users2;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | bigint | NO | PRI | NULL | |
| name | varchar(45) | YES | | NULL | |
| email | varchar(100) | YES | UNI | NULL | |
| password | varchar(200) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
๊ทธ๋ผ ํ์ด์ฌ ์ฝ๋๋ก ์์ฑํ ํ ์ด๋ธ๊ณผ ๋๊ฐ์ ํ ์ด๋ธ์ด ์์ฑ๋๋ค. ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด ํ์ด์ฌ์ผ๋ก ์์ฑํ ๋ชจ๋ธ์ id field๋ฅผ ์์ฑํ์ง ์์๋ ์๋์ผ๋ก ์์ฑ๋์ง๋ง ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์์ฑํ ๋๋ ์ง์ ์์ฑํด์ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
Django shell ์ด์ฉํ๊ธฐ
Django ORM์ ์ด์ฉํ์ฌ ํ ์ด๋ธ์ ์์ฑํ๋ ๊ฒ ๋ง๊ณ ๋ ํ ์ด๋ธ์ ํ์ ์ถ๊ฐํ ์๋ ์๋ค. Django shell์ ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ ํ ์ด๋ธ์ ํ์ ์ถ๊ฐํ๊ฑฐ๋, ์ญ์ ํ ์ ์๋ค.
python manage.py shell
์ ๋ช ๋ น์ด๋ฅผ manage.py ๊ฐ ์๋ ์์น์์ ์คํํ๋ฉด
python manage.py shell
Python 3.8.12 (default, Oct 12 2021, 06:23:56)
[Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
์์ ๊ฐ์ shell ํ๋ฉด์ด ๋ณด์ผ ๊ฒ์ด๋ค.
mysql> select * from users;
Empty set (0.00 sec)
mysql์์ ์์์ ๋ง๋ users ํ ์ด๋ธ์ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ฉด ์๋ฌด๊ฒ๋ ์ ์ฅ๋์ด ์์ง ์์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
# django shell
>>> from users.models import User
๋จผ์ ์ฅ๊ณ ์์์ models์ ์์ฑํ User ํด๋์ค๋ฅผ import ํด์จ๋ค.
# django shell
>>> User.objects.all()
<QuerySet []>
User์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์์ ๊ฐ์ด ํ์ธํด๋ณด๋ฉด ์๋ฌด๊ฒ๋ ๋ค์ด์์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋น Queryset์ด ๋ฐํ๋๋๋ฐ ์ฌ๊ธฐ์ Queryset์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด์ ๋ชฉ๋ก์ด๋ผ๊ณ ํ ์ ์๋ค.
# django shell
>>> User.objects.create(name="๋ฆฌ๋ฏธ", email="hyerimc858@gmail.com", password="abcd1234!")
<User: User object (1)>
์์ฒ๋ผ objects.create๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
# django shell
>>> User.objects.all()
<QuerySet [<User: User object (1)>]>
์์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ๋ถ๋ฌ์ค๋ฉด QuerySet์์ ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
mysql> INSERT INTO users VALUES(2, '์์ด', 'hyeyoung1234@gmail.com', 'abc1234!');
Query OK, 1 row affected (0.00 sec)
์์์ django shell๋ก objects.create ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋๋ฐ, ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก๋ INSERT INTO ํ ์ด๋ธ๋ช VALUES (๊ฐ1, ๊ฐ 2 ...)
๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
์ด์ฒ๋ผ django orm์ ์ด์ฉํ์ฌ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ ํ ์ ์์ง๋ง, orm์ผ๋ก ๋ชจ๋ ๊ฒ์ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ด orm์ผ๋ก ์์ฑํ ์ฝ๋๋ฅผ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์์ฑํ๋ฉด ์ด๋ป๊ฒ ์์ฑํ ์ ์์๊น? ๋ผ๋ ๊ณ ๋ฏผ์ ํด๋ณด์์ผ ํ ๊ฒ ๊ฐ๋ค.
์ด์จ๋ , orm ์ต๊ณ ! ๐
'Python > ๐ฆ Django' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Django] DRF ์๋ ํ๋ฆ (0) | 2023.11.23 |
---|---|
[Django] ์ฝ๋ฉ ์คํ์ผ (0) | 2023.09.04 |
[Django] Django Custom Command (0) | 2023.09.04 |
[Django] JWT๋ก ๋ก๊ทธ์์์ ๊ตฌํํด๋ณด์ (0) | 2023.09.04 |
[Django] QuerySet ์ดํดํ๊ธฐ - Lazy Loading, Caching, Eager Loading (0) | 2023.09.04 |