前提・実現したいこと
Djangoで短縮URLを作る機能を作っています。
短縮URLをpostしたときに以下のエラーが発生しました。
このエラーを解決し、短縮URLのデータをデータベースに追加できるようにしたいです。
発生している問題・エラーメッセージ
ProgrammingError at /url_shorten/create relation "url_shorten_urlshorten" does not exist LINE 1: INSERT INTO "url_shorten_urlshorten" ...
データベースでrelationが作られていない模様です。
該当のソースコード
bash
1#entrypoint.bash djangoのコンテナ起動時に実行されるbash 2#!/bin/bash 3python3 manage.py migrate --fake 4python3 manage.py makemigrations 5python3 manage.py migrate 6service apache2 start 7python3 manage.py runserver 0.0.0.0:8000 # Dockerが閉じないように
python
1#URLのモデル 2from django.db import models 3 4# Create your models here. 5 6class UrlShorten(models.Model): 7 class Meta: 8 managed = True 9 10 base_url = models.URLField(max_length=200, blank=True) 11 shorten_url_keyword = models.CharField(max_length=200, blank=True) 12
python
1#settings.py データベースの部分 2DATABASES = { 3 'default': { 4 'ENGINE': 'django.db.backends.postgresql_psycopg2', 5 'NAME': 'django_db', 6 'USER': config["DB_USER"], 7 'PASSWORD': config["DB_PASSWORD"], 8 'HOST': 'db', 9 'PORT': "5432", 10 } 11}
試したこと
データベースの問題なので、migrationに重点をおいて調べてみました。
- python3 manage.py migrate --fakeの実行
=> 問題解決せず
2. python3 manage.py --run-syncdbの実行
=> 問題解決せず
3. python3 manage.py sqlmigrate url_shorten 0001の実行
sqlmigrateで出てきたSQLクエリを直接postgresqlサーバーで入れてみました。
bash
1$ python3 manage.py sqlmigrate url_shorten 0001 2BEGIN; 3-- 4-- Create model UrlShorten 5-- 6CREATE TABLE "url_shorten_urlshorten" ("id" bigserial NOT NULL PRIMARY KEY, "base_url" varchar(200) NOT NULL, "shorten_url_keyword" varchar(200) NOT NULL); 7COMMIT;
postgresql
1django_db=# \l 2 List of databases 3 Name | Owner | Encoding | Collate | Ctype | Access privileges 4-----------+-------+----------+------------+------------+------------------- 5 django_db | root | UTF8 | en_US.utf8 | en_US.utf8 | 6 postgres | root | UTF8 | en_US.utf8 | en_US.utf8 | 7 template0 | root | UTF8 | en_US.utf8 | en_US.utf8 | =c/root + 8 | | | | | root=CTc/root 9 template1 | root | UTF8 | en_US.utf8 | en_US.utf8 | =c/root + 10 | | | | | root=CTc/root 11(4 rows) 12 13django_db=# BEGIN; 14BEGIN 15django_db=# -- 16django_db=# -- Create model UrlShorten 17django_db=# -- 18django_db=# CREATE TABLE "url_shorten_urlshorten" ("id" bigserial NOT NULL PRIMARY KEY, "base_url" varchar(200) NOT NULL, "shorten_url_keyword" varchar(200) NOT NULL); 19CREATE TABLE 20django_db=# COMMIT; 21COMMIT 22 23django_db-# \d 24 List of relations 25 Schema | Name | Type | Owner 26--------+-------------------------------+----------+------- 27 public | url_shorten_urlshorten | table | root 28 public | url_shorten_urlshorten_id_seq | sequence | root 29(2 rows) 30
そうして短縮URLをpostすると、以下のエラーメッセージが出ました。
IntegrityError at /url_shorten/create duplicate key value violates unique constraint "url_shorten_urlshorten_pkey" DETAIL: Key (id)=(1) already exists.
Keyがかぶっているようです。tableを自分で作るのは良くないのかと思い、ここに相談しました。
補足情報(FW/ツールのバージョンなど)
requirements.txtを示します。
requirements
1django==3.2 2psycopg2 3psycopg2-binary 4uwsgi
djangoサーバー、postgresqlサーバーともにdockerを使用しています。
djangoのイメージは python
postgresqlのイメージは postgres:11
です。
あなたの回答
tips
プレビュー