장고에서의 데이터 타입을 다루는 법과 MySQL에서 표현되는 데이터 타입 다루는 법 비교
장고 ORM 쿼리, SQL 문 비교 (실제로 데이터베이스에서 수행되는 SQL문을 비교 학습)
장고에서는 다양한 타입의 데이터를 데이터베이스 종류와는 독립적인 형태로 객체화해서 모델 매니저의 메서드를 사용하여 데이터베이스에 쿼리 할 수 있음
쿼리셋의 객체<Users: Users object (1)> 가 MySQL 데이터베이스의 id 1의 전체 row 와 대응
데이터베이스의 한 row 데이터가 장고의 User클래스의 객체와 매핑
SQL
INT Django
IntegetField
SQL
VARCHAR(n) Django
CharField(max_length=n)
SQL
TEXT Django
TextField()
SQL
DATETIME Django
DateTimeField()
SQL
FLOAT(n) Django
TextField()
SQL
DATE Django
DateField()
SQL
TIME Django
TimeField()
SELECT (all)
select * from Users;;
>>> users = User.objects.all()
>>> for user in users:
... print(user.email)
... print(user.name)
SELECT 특정 column
select name, phoneNumber from Users;
>>> list12 = User.objects.only('name', 'email')
>>> for list123 in list12:
... print(list123)
only라는 메서드를 사용하여 가져올 수가 있는데, 어차피 쿼리셋으로 반환되기 때문에 다시 그 객체에 접근하는 형태로 사용해야 함. 어떤 효용이 있는 건지 잘 모르겠음..
Fetch distinct rows
select distinct name, email from Users;
name, email에 대항하는 column이 쭉 반환이 됨
>>> User.objects.values('name', 'email').distinct()
<QuerySet [{'name': '동헌', 'email': 'asdasd@gmail.com'}, {'name': '준호', 'email': 'vvddqq@gmail.com'}, {'name': '지운', 'email': 'vvddq@gmail.com'}, {'name': '미카엘', 'email': 'vndjve@yahoo.com'}, {'name': '베일', 'email': 'darknight@yahoo.com'}, {'name': '매튜', 'email': 'worf@yahoo.com'}, {'name': '크리스', 'email':'worf@wecode.com'}
values 메서드를 사용하여, 그 안에 조건을 주고 그에 대항하는 row값을 변환한다.
values니까 딕셔너리로 반환되고, 그 딕셔너리는 조건이 들어간 것.
Fetch specific number of rows
select * from Users limit 10;
User.objects.all()[:10]
10개만 반환이 됨
Filter by single column
select * from Users where id = 13;
id = 13에 대항하는 row만 반환
User.objects.filter(id=1)
퀴리셋으로 반환
Filter by comparison operators
WHERE age > 18;
WHERE age >= 18;
WHERE age < 18;
WHERE age <= 18;
WHERE age != 18;
Person.objects.filter(age__gt=18)
Person.objects.filter(age__gte=18)
Person.objects.filter(age__lt=18)
Person.objects.filter(age__lte=18)
Person.objects.exclude(age=18)
age, 이런 숫자로 이뤄진 컬럼 존재 시 사용 가능. id로는 안되는 거 같음
Ordered Filter / Ascending Order / Descending Order
select * from Users order by name;
User.objects.order_by('name')
select * from Users order by age DESC;
User.objects.order_by('-name')
내림차순 정렬, 오름차순 정렬
Update Statement
update users set name='호이호이' where id = 40;
sql문으로 추가할 수 있음
>>> user12 = User.objects.get(id=41)
>>> user12.name = '환환'
>>> user12.save()
업데이트 할 수 있음
Delete Statement
DELETE FROM Person WHERE age < 10;
Person.objects.filter(age__lt=10).delete()
삭제 가능