Aquery 툴을 이용해서 만들었던 데이터베이스를 토대로
이번에는 스타벅스에서 음료와 푸드에 대한 내용을 가지고 와서 csv파일에 저장해주고
DB에 넣어주는 과정입니다
크롤링에 대한 코드는 따로 없고요, 가지고온 csv 파일입니다
두개가 각자 다른 영양정보를 표시하고 있어서 테이블을 나눠서 해볼게요
menu --- ForeingKey --- categories
category --- ForeignKey --- drinks, foods
drink, food --- ForeignKey --- images, nutritions
drink, food -- ManyToMany --- allergies
카테고리 탭은 종류가 몇백가지 되는게 아니기 때문에
테이블을 따로 추가 할 필요가 없다고 생각함
nutirition의 경우 둘이 겹치는 부분이 많아 중간 테이블로 놓고
겹치지 않는 부분은 null = True로 할려고 했으나,,,
스타벅스 내에서는 html상으로는 존재하지만, 디자인상 뺀 영양정보가 몇몇 있습니다
나중에 추가하거나 할 경우, 나눠서 관리하는게 낫겟다 생각 했습니다
이미지가 추가될 경우를 생각해서 One To Many 관계로 설정
1. 중간 테이블을 놓게 되면 manytomany 관계가 형성되게 되는데
같은 정보를 공유하고 있다면, 관계를 형성해도 괜찮나??
알러지의 경우는 테이블을 따로 놔서 allergy를 중간테이블로 놓고
drink와 알러지, food와 알러지 따로 생성
SQL문 연습과 views.py 를 이용해서 데이터를 넣어 보는게 목적이라, 둘다 합니다
INSERT INTO menus (name) VALUES ("음료");
INSERT INTO menus (name) VALUES ("푸드");
INSERT INTO categories (name, menu_id) VALUES ("콜드브루", 1);
DELETE FROM categories WHERE name = "콜드브루";
for r in reader:
menu = Menu.objects.get(id = 1)
category = Category.objects.create(name = r[1], menu = menu)
drink = Drink.objects.create(name = r[2], category = category)
nutrition = DrinkNutritions.objects.create(serving_size = "355ml", one_serving_kcal = r[3], saturated_fat_g = r[4], protein_g = r[5], sodium_mg = r[6], sugars_g = r[7], caffeine_mg = r[8], drink = drink)
image = DrinkImage.objects.create(drink = drink, image_url = r[9])
csv파일을 읽어와서 하나씩 넣어 줬습니다
이제 기대하면서 mysql을 열었는데,,,
ㅋ
아아 ... 이러지마 나한테 ...
원래는 get_or_create를 써서 할려했으나,
get_or_create를 사용해서 실행 해보니
저렇게 category객체와 False가 나오길래
아... if문을 써야겠다 했는데...
그냥 돌려 버렷어요 😂🔫
데이터 날려버리고 다시 할까 했는데,,, 이 또한 연습이지 않을까?
생각이 들었습니다
근데 ForeignKey로 연결이 되있는게 ... 다 날리고 다시 해보겠습니다
생각해보니 미친짓 같에요
저걸 바꿔 줄려면 categories에 연결되어있는 drinks를
ALTER TABLE 을 사용해서 다 옮겨주고 카테고리 삭제해주고
아.. 다시 날리고 하겠습니다
이런경우 필요한건 TRUNCATE 입니다
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE drink_images;
TRUNCATE TABLE drink_nutritions;
TRUNCATE TABLE drinks;
TRUNCATE TABLE categories;
SET FOREIGN_KEY_CHECKS = 1;
다시 가볼게요
존재하지 않는다면 만들어주고, 존재 한다면 가지고 와서
카테고리를 추가 해줬습니다
숫자를 DecimalField로 넣은 이유는 확장성 때문입니다
IntegerField의 경우 숫자를 표현해 주기는 하지만, 소수점은 표현되지 않습니다
따라서 더 자세한 수치를 추가해줄 경우를 대비해서
DecimalField를 사용해줍니다
이제 이 데이터를 통해서 여러가지 공부했던 SQL을 연습하고 올게요...
It's a nice Blog thank you for sharing for us. Hope You will provide us with this type of great post. And If anyone is searching about Cloud Kitchen so you can visit our web page.
O_O ! 치킨매ㄴ16ㅏ 랭킹 1위 클라스... 멋져요 준형님!
1일 1포스팅 실천하시는거 너무 대단하시네요