장고에서는 기본적으로 sqlite를 데이터베이스로 쓰는데 heroku로 배포하면서 postgresql을 사용하게 되었습니다.
(헤로쿠에서는 sqlite를 사용할 수 없는 것 같더라구요..ㅜㅜ)
그래서 로컬 sqlite에 있는 데이터들을 postgresql로 옮겨주고 연동을 진행하게 되었습니다.
시작하기 전에 postgresql과 pgadmin을 깔아줍니다. postgresql은 pgAdmin이라는 도구를 이용해서 데이터베이스를 쉽게 관리한다고 합니다.
1. fixtures 폴더 만들기
먼저 장고에서 앱 하위에 fixtures 폴더를 만듭니다.
2. 로컬에 있는 데이터를 dump 파일로 만들기
python manage.py dumpdata --exclude=contenttypes --exclude=auth.Permission > datadump.json
다른 블로그들을 보면 아래 명령어를 쳐서 dump 파일을 만드는데
python manage.py dumpdata > dump.json
저는 다음과 같은 에러 메시지가 이후 단계(loaddata 하는 부분)에서 떠서 저 명령어로 수정했더니 해결되었습니다.
에러메시지
django.core.serializers.base.DeserializationError: Problem installing fixture 'C:\Users\USER\PycharmProjects\deliveryFriend\fixtures\dump2.json':
https://stackoverflow.com/questions/36213769/django-1-9-loaddata-errors
Django 1.9 loaddata errors
ubuntu 15.10 venv python 3.4 / django 1.9 command: python manage.py loaddata flight_data.json(yaml) errors: json: django.core.serializers.base.DeserializationError: Problem installing fixt...
stackoverflow.com
그리고 데이터를 콘솔창에서 확인하고 싶으면 python manage.py dumpdata 치면 확인할 수 있습니다.
3. 만든 dump 파일을 fixtures 디렉토리로 옮겨주기
옮겨주지 않고 진행하게 되면 이후 단계(loaddata 하는 부분)에서 다음과 같은 에러가 뜨게 됩니다.(추가 설명)
에러메시지
CommandError: No fixture named 'dump' found.
4.
dump.json에 장고에 기본적으로 있는 데이터들을 loaddata할 때 중복되지 않도록 지워줍니다.
(venv) C:\Users\USER\PycharmProjects\deliveryFriend> python manage.py shell
Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:38) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
(55, {'auth.Permission': 44, 'contenttypes.ContentType': 11})
>>> quit()
5. heroku에 배포하기
내 깃에 커밋 후 push 해준 다음
git push heroku master
6.
dump.json에 담아둔 data를 heroku의 postgresql에 load 해줍니다.
heroku run python manage.py loaddata dump.json --app 앱이름
heroku run python manage.py loaddata fixtures/datadump.json --app delivery-friend
json 파일에 한글이 포함되어 있을 경우 다음과 같에 에러메시지가 뜨는 경우가 있습니다.
에러메시지
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 397: invalid continuation byte
그럴 때는 datadump를 메모장으로 열고 '다른 이름으로 저장'을 누른 뒤 파일명에 확장자를 json으로 지정해주고(지정안해주면 text 파일로 저장됨) 인코딩을 urf-8로 바꿔준 뒤 저장하면 해결됩니다.
그런데 또 다음과 같은 에러가 남..
에러메시지
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "django_admin_log" does not exist
LINE 1: UPDATE "django_admin_log" SET "action_time" = '2022-02-18T07...
^
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/app/manage.py", line 22, in <module>
main()
File "/app/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
utility.execute()
File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/__init__.py", line 413, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/base.py", line 354, in run_from_argv
self.execute(*args, **cmd_options)
File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/base.py", line 398, in execute
output = self.handle(*args, **options)
File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/commands/loaddata.py", line 78, in handle
self.loaddata(fixture_labels)
File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/commands/loaddata.py", line 123, in loaddata
self.load_label(fixture_label)
File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/commands/loaddata.py", line 190, in load_label
obj.save(using=self.using)
File "/app/.heroku/python/lib/python3.9/site-packages/django/core/serializers/base.py", line 223, in save
models.Model.save_base(self.object, using=using, raw=True, **kwargs)
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/models/base.py", line 763, in save_base
updated = self._save_table(
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/models/base.py", line 845, in _save_table
updated = self._do_update(base_qs, using, pk_val, values, update_fields,
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/models/base.py", line 899, in _do_update
return filtered._update(values) > 0
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/models/query.py", line 802, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1559, in execute_sql
cursor = super().execute_sql(result_type)
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1175, in execute_sql
cursor.execute(sql, params)
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py", line 98, in execute
return super().execute(sql, params)
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: Problem installing fixture '/app/fixtures/datadump.json': Could not load admin.LogEntry(pk=1): relation "django_admin_log
" does not exist
LINE 1: UPDATE "django_admin_log" SET "action_time" = '2022-02-18T07...
heroku run python manage.py shell --app delivery-friend
를 실행했더니
에러메시지
Running python manage.py shell on ⬢ delivery-friend... up, run.8095 (Free)
Python 3.9.10 (main, Jan 14 2022, 23:17:45)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "django_content_type" does not exist
LINE 1: ..."."app_label", "django_content_type"."model" FROM "django_co...
해결 방법
heroku run python manage.py migrate --app delivery-friend
heroku run python manage.py migrate --fake contenttypes --app delivery-friend
Django column "name" of relation "django_content_type" does not exist
I keep getting the following error when doing a migration (python manage.py migrate): django.db.utils.ProgrammingError: column "name" of relation "django_content_type" does not exist I've done the
stackoverflow.com
후에 다시 loaddata 해주면 정상적으로 돌아갑니다.
Running python manage.py loaddata fixtures/datadump.json on ⬢ delivery-friend... up, run.6519 (Free)
Installed 33 object(s) from 1 fixture(s)
헤로쿠 콘솔 보면 데이터가 잘 들어가 있는 것을 볼 수 있습니다.
7.
이제 이 데이터를 어떻게 확인하면 될까요? 아까 설치한 pgadmin을 사용하면 됩니다.
헤로쿠 데이터베이스 콘솔을 보고 server를 만들어주세요. pgadmin의 heroku postgresql을 연동합니다.
데이터베이스가 엄청 많은데 그 중에서 이 전단계에서 입력해준 데이터베이스 이름을 찾아서 클릭하고 스키마>테이블 클릭하면 sqlite에서 만들어놓은 테이블들이 postgresql로 잘 옮겨진 것을 볼 수 있습니다.
[REFERENCE]
https://hevodata.com/learn/sqlite-to-postgresql/
Moving Data from SQLite to PostgreSQL: 4 Easy Steps
This blog provides a 4 step method to load data from SQLite to PostgreSQL seamlessly. Read along to learn the steps & best practices for this data migration.
hevodata.com
https://bhpark.tistory.com/225
pgAdmin 4를 이용한 Backup과 Restore
Restore를 하기 위하여 열심히 Backup을 하는데 정작 Restore는 그리 자주 할 일이 없어 자꾸 까먹는다. 자주 하면 텍스트 명령어로 하면 좋겠지만 자주 안하는데 굳이 텍스트 명령어로 할 일이 없을
bhpark.tistory.com
https://dev.to/aidenellis/upload-existing-django-sqlite-database-to-heroku-1e4e
Upload Existing Django Sqlite database to heroku.
So, for a few days i've been struggling to upload my old database which was sqlite3 to heroku's Postg...
dev.to
https://eunjin3786.tistory.com/396
[Heroku] Migrate Django SQLite to PostgreSQL
[ 이슈 ] 장고의 로컬에서 기본적으로 SQLite3 를 씁니다. 헤로쿠(기본이 PostgreSQL)에 배포한 후, 리얼에서도 로컬의 sqlite 파일을 그대로 쓰고 싶었는데 (로컬 데이터를 그대로 쓸 것이고 더이상 추
eunjin3786.tistory.com
https://gist.github.com/sirodoht/f598d14e9644e2d3909629a41e3522ad
How to migrate Django from SQLite to PostgreSQL
How to migrate Django from SQLite to PostgreSQL. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
'Django' 카테고리의 다른 글
[Django] heroku 서버 배포 (1) | 2022.03.03 |
---|---|
[BlogApp] 태그 기능 개발 (0) | 2022.01.24 |
[BlogApp] views.py 작성 (1) | 2022.01.24 |
[BlogApp] URLconf 2계층으로 코딩하기 (0) | 2022.01.24 |
[BlogApp] admin.py 작성 (0) | 2022.01.23 |