Django API (2)

유동헌·2021년 4월 11일
0

Django

목록 보기
4/4

개요

장고에서의 데이터 타입을 다루는 법과 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()

삭제 가능

profile
지뢰찾기 개발자

0개의 댓글