본문 바로가기
소프트웨어 마에스트로/BackEnd(Django)

[백엔드] mysql 한글 깨짐 + django 테이블 반영 안됨 + html form 에 안뜨는 문제

by alpakaka 2024. 7. 10.

utf8이 아니여서 계속 한글이 깨지는 현상이 발생했다

영어는 잘 인식하는 것 같다


https://security-guide.tistory.com/115

 

[MySQL] Docker-compose 사용 시 MySQL 한글 깨짐 현상 해결하기

command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --skip-character-set-client-handshake docker-compose.yml의 mysql 이미지를 받아올때 위 옵션을 붙여주면 된다. 이후 mysql 컨테이너에서 show variable

security-guide.tistory.com

이 블로그를 참고해서 docker compose.yml 을 변경했다 -> 어째서인지 나에게는적용이 안되었다..

그래서 아래와 같이 해결했다

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

my.cnf 파일을 생성하였고 위와 같이 채웠다

 

services:
  db:
    image: mysql:latest
    container_name: mysql
    restart: always
    volumes:
      - data:/var/lib/mysql
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    env_file:
      - .env
    ports:
      - "3306:3306"

volumes 에 해당 파일을 연결해주었더니 해결되었다

 

 

 

또 직면한 문제..

잘못으로 유추되는 것

todos 파일 안의 migrations 안에 있는 모든 파일을 지워버렸다 (원래 __init__.py 를 제외한 모든 파일을 지우는 거라고 한다.. )

그래도.. 나름... docker compose 켜서 터미널에서 강제로 makemigrations 와 migrate를 진행했다..

그래서 결과..

backend-1  | Operations to perform:
backend-1  |   Apply all migrations: accounts, admin, auth, contenttypes, sessions, todos
backend-1  | Running migrations:
backend-1  |   No migrations to apply.

migrations 에선 잡힌다.

근데 문제는 mysql 테이블에서 보이지 않는다..

mysql> show tables;
+------------------------+
| Tables_in_onestep_demo |
+------------------------+
| accounts_user          |
| auth_group             |
| auth_group_permissions |
| auth_permission        |
| django_admin_log       |
| django_content_type    |
| django_migrations      |
| django_session         |
+------------------------+
8 rows in set (0.02 sec)

 

showmigrations 도 진행해봤는데.. 잘 나온다..

 

docker-compose exec backend python manage.py showmigrations todos

todos

 [X] 0001_initial

 

python manage.py sqlmigrate todos 0001
--
-- Create model Todo
--
CREATE TABLE `todos_todo` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `content` varchar(255) NOT NULL, `category` varchar(7) NOT NULL, `start_date` date NOT NULL, `deadline` date NOT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, `deleted_at` datetime(6) NULL, `parent_id_id` integer NULL, `user_id_id` bigint NOT NULL);
ALTER TABLE `todos_todo` ADD CONSTRAINT `todos_todo_parent_id_id_7176494b_fk_todos_todo_id` FOREIGN KEY (`parent_id_id`) REFERENCES `todos_todo` (`id`);
ALTER TABLE `todos_todo` ADD CONSTRAINT `todos_todo_user_id_id_8e4872ce_fk_accounts_user_id` FOREIGN KEY (`user_id_id`) REFERENCES `accounts_user` (`id`);

이것도 안됐다...

 

 select * from django_migrations
    -> ;
+----+--------------+---------------------------------------------------------------+----------------------------+
| id | app          | name                                                          | applied                    |
+----+--------------+---------------------------------------------------------------+----------------------------+
|  1 | accounts     | 0001_initial                                                  | 2024-07-05 13:52:42.063959 |
|  2 | contenttypes | 0001_initial                                                  | 2024-07-05 13:52:42.090672 |
|  3 | admin        | 0001_initial                                                  | 2024-07-05 13:52:42.208831 |
|  4 | admin        | 0002_logentry_remove_auto_add                                 | 2024-07-05 13:52:42.213438 |
|  5 | admin        | 0003_logentry_add_action_flag_choices                         | 2024-07-05 13:52:42.220833 |
|  6 | contenttypes | 0002_remove_content_type_name                                 | 2024-07-05 13:52:42.255693 |
|  7 | auth         | 0001_initial                                                  | 2024-07-05 13:52:42.388395 |
|  8 | auth         | 0002_alter_permission_name_max_length                         | 2024-07-05 13:52:42.415625 |
|  9 | auth         | 0003_alter_user_email_max_length                              | 2024-07-05 13:52:42.419194 |
| 10 | auth         | 0004_alter_user_username_opts                                 | 2024-07-05 13:52:42.422045 |
| 11 | auth         | 0005_alter_user_last_login_null                               | 2024-07-05 13:52:42.425861 |
| 12 | auth         | 0006_require_contenttypes_0002                                | 2024-07-05 13:52:42.429240 |
| 13 | auth         | 0007_alter_validators_add_error_messages                      | 2024-07-05 13:52:42.432684 |
| 14 | auth         | 0008_alter_user_username_max_length                           | 2024-07-05 13:52:42.435705 |
| 15 | auth         | 0009_alter_user_last_name_max_length                          | 2024-07-05 13:52:42.439924 |
| 16 | auth         | 0010_alter_group_name_max_length                              | 2024-07-05 13:52:42.447444 |
| 17 | auth         | 0011_update_proxy_permissions                                 | 2024-07-05 13:52:42.451911 |
| 18 | auth         | 0012_alter_user_first_name_max_length                         | 2024-07-05 13:52:42.455433 |
| 19 | sessions     | 0001_initial                                                  | 2024-07-05 13:52:42.475314 |
| 20 | todos        | 0001_initial                                                  | 2024-07-07 14:09:07.885764 |
| 21 | todos        | 0002_todo_created_at_todo_deleted_at_todo_updated_at_and_more | 2024-07-08 09:12:44.948995 |
+----+--------------+---------------------------------------------------------------+----------------------------+
21 rows in set (0.00 sec)

이런방법이 있길래 id 20과 21을 지워줬다

mysql> select * from django_migrations;
+----+--------------+------------------------------------------+----------------------------+
| id | app          | name                                     | applied                    |
+----+--------------+------------------------------------------+----------------------------+
|  1 | accounts     | 0001_initial                             | 2024-07-05 13:52:42.063959 |
|  2 | contenttypes | 0001_initial                             | 2024-07-05 13:52:42.090672 |
|  3 | admin        | 0001_initial                             | 2024-07-05 13:52:42.208831 |
|  4 | admin        | 0002_logentry_remove_auto_add            | 2024-07-05 13:52:42.213438 |
|  5 | admin        | 0003_logentry_add_action_flag_choices    | 2024-07-05 13:52:42.220833 |
|  6 | contenttypes | 0002_remove_content_type_name            | 2024-07-05 13:52:42.255693 |
|  7 | auth         | 0001_initial                             | 2024-07-05 13:52:42.388395 |
|  8 | auth         | 0002_alter_permission_name_max_length    | 2024-07-05 13:52:42.415625 |
|  9 | auth         | 0003_alter_user_email_max_length         | 2024-07-05 13:52:42.419194 |
| 10 | auth         | 0004_alter_user_username_opts            | 2024-07-05 13:52:42.422045 |
| 11 | auth         | 0005_alter_user_last_login_null          | 2024-07-05 13:52:42.425861 |
| 12 | auth         | 0006_require_contenttypes_0002           | 2024-07-05 13:52:42.429240 |
| 13 | auth         | 0007_alter_validators_add_error_messages | 2024-07-05 13:52:42.432684 |
| 14 | auth         | 0008_alter_user_username_max_length      | 2024-07-05 13:52:42.435705 |
| 15 | auth         | 0009_alter_user_last_name_max_length     | 2024-07-05 13:52:42.439924 |
| 16 | auth         | 0010_alter_group_name_max_length         | 2024-07-05 13:52:42.447444 |
| 17 | auth         | 0011_update_proxy_permissions            | 2024-07-05 13:52:42.451911 |
| 18 | auth         | 0012_alter_user_first_name_max_length    | 2024-07-05 13:52:42.455433 |
| 19 | sessions     | 0001_initial                             | 2024-07-05 13:52:42.475314 |
+----+--------------+------------------------------------------+----------------------------+

 

그 후에 migrate 를 실행해주니 반영 되었다!

 

mysql> show tables;
+------------------------+
| Tables_in_onestep_demo |
+------------------------+
| accounts_user          |
| auth_group             |
| auth_group_permissions |
| auth_permission        |
| django_admin_log       |
| django_content_type    |
| django_migrations      |
| django_session         |
| todos_todo             |
+------------------------+
9 rows in set (0.00 sec)

 

 

또 생긴 문제..

어째서인지 user_id 가 안보인다.

class TodoSerializer(serializers.ModelSerializer):
    user_id = serializers.ReadOnlyField(source="user_id.id")
    content = serializers.CharField(max_length=255)
    category = serializers.CharField(max_length=7)
    start_date = serializers.DateField()
    deadline = serializers.DateField()
    parent_id = serializers.PrimaryKeyRelatedField(queryset=Todo.objects.all(), allow_null=True, required=False)
    order = serializers.IntegerField(default=0)
    is_completed = serializers.BooleanField(default=False)
    
    class Meta:
        model = Todo
        fields = ['id', 'content', 'category', 'start_date', 'deadline', 'parent_id', 'user_id', 'order', 'is_completed']

ReadOnlyField 라고 작성한게 문제인 것 같아서 일단 찾아본다

https://velog.io/@hwisaac/DRF-Serializer-Fields

 

DRF: Serializer Fields

각각의 폼 클래스의 필드는 데이터의 유효성을 검사하는 것뿐만 아니라 데이터를 "클린징"하여 일관된 형식으로 정규화하는 역할을 합니다.— Django 문서(https://docs.djangoproject.com/en/stable/ref/forms/

velog.io

대략 유추한 바로는 값을 넣는 용이 아니라 그냥 불러오는 용이였나 보다

https://medium.com/@heeee/til-drf-serializer%EC%97%90%EC%84%9C-%EC%99%B8%EB%9E%98%ED%82%A4-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%98-%ED%95%84%EB%93%9C-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0-242c06b25dc2

 

[TIL] DRF serializer에서 외래키 테이블의 필드 가져오기

Set up

medium.com

 

 user_id = serializers.RelatedField(queryset=User.signup.all())

팀원분이 User.signup 으로 사용하시길래 사용해봤다. 어째서인지 된다..!

오늘은 여기까지..