質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

0回答

1120閲覧

Django: postgresqlにrelationが作られないエラーの解決方法

JUN_SAN

総合スコア5

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/11/06 08:30

前提・実現したいこと

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に重点をおいて調べてみました。

  1. 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
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問