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

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

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

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1455閲覧

DBをPostgreSQLにする2種類の書き方の違いを教えてください

Kazuhiro-ch

総合スコア85

Django

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/08/10 08:42

編集2021/08/10 09:09

DjangoでHerokuデプロイするときに、DBをPostgreSQLへ変える書き方として2種類書かれていましたが、どう違いますか?また、どちらを採用するべきですか?いまいちそれぞれどう作用するのかがわかりません。

2つ目のコードはなんとなく直接アクセスできるのはわかりますが、1つ目が不透明で特にわかりません。

import dj_database_url db_from_env = dj_database_url.config() DATABASES = { 'default': dj_database_url.config() }
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'XXXXXX', 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': '', 'PORT': '', } }

追記

import os try: import urlparse except ImportError: import urllib.parse as urlparse try: from django import VERSION as DJANGO_VERSION except ImportError: DJANGO_VERSION = None # Register database schemes in URLs. urlparse.uses_netloc.append('postgres') urlparse.uses_netloc.append('postgresql') urlparse.uses_netloc.append('pgsql') urlparse.uses_netloc.append('postgis') urlparse.uses_netloc.append('mysql') urlparse.uses_netloc.append('mysql2') urlparse.uses_netloc.append('mysqlgis') urlparse.uses_netloc.append('mysql-connector') urlparse.uses_netloc.append('mssql') urlparse.uses_netloc.append('spatialite') urlparse.uses_netloc.append('sqlite') urlparse.uses_netloc.append('oracle') urlparse.uses_netloc.append('oraclegis') urlparse.uses_netloc.append('redshift') DEFAULT_ENV = 'DATABASE_URL' SCHEMES = { 'postgis': 'django.contrib.gis.db.backends.postgis', 'mysql': 'django.db.backends.mysql', 'mysql2': 'django.db.backends.mysql', 'mysqlgis': 'django.contrib.gis.db.backends.mysql', 'mysql-connector': 'mysql.connector.django', 'mssql': 'sql_server.pyodbc', 'spatialite': 'django.contrib.gis.db.backends.spatialite', 'sqlite': 'django.db.backends.sqlite3', 'oracle': 'django.db.backends.oracle', 'oraclegis': 'django.contrib.gis.db.backends.oracle', 'redshift': 'django_redshift_backend', } # https://docs.djangoproject.com/en/2.0/releases/2.0/#id1 if DJANGO_VERSION and DJANGO_VERSION < (2, 0): SCHEMES['postgres'] = 'django.db.backends.postgresql_psycopg2' SCHEMES['postgresql'] = 'django.db.backends.postgresql_psycopg2' SCHEMES['pgsql'] = 'django.db.backends.postgresql_psycopg2' else: SCHEMES['postgres'] = 'django.db.backends.postgresql' SCHEMES['postgresql'] = 'django.db.backends.postgresql' SCHEMES['pgsql'] = 'django.db.backends.postgresql' def config(env=DEFAULT_ENV, default=None, engine=None, conn_max_age=0, ssl_require=False): """Returns configured DATABASE dictionary from DATABASE_URL.""" config = {} s = os.environ.get(env, default) if s: config = parse(s, engine, conn_max_age, ssl_require) return config def parse(url, engine=None, conn_max_age=0, ssl_require=False): """Parses a database URL.""" if url == 'sqlite://:memory:': # this is a special case, because if we pass this URL into # urlparse, urlparse will choke trying to interpret "memory" # as a port number return { 'ENGINE': SCHEMES['sqlite'], 'NAME': ':memory:' } # note: no other settings are required for sqlite # otherwise parse the url as normal config = {} url = urlparse.urlparse(url) # Split query strings from path. path = url.path[1:] if '?' in path and not url.query: path, query = path.split('?', 2) else: path, query = path, url.query query = urlparse.parse_qs(query) # If we are using sqlite and we have no path, then assume we # want an in-memory database (this is the behaviour of sqlalchemy) if url.scheme == 'sqlite' and path == '': path = ':memory:' # Handle postgres percent-encoded paths. hostname = url.hostname or '' if '%2f' in hostname.lower(): # Switch to url.netloc to avoid lower cased paths hostname = url.netloc if "@" in hostname: hostname = hostname.rsplit("@", 1)[1] if ":" in hostname: hostname = hostname.split(":", 1)[0] hostname = hostname.replace('%2f', '/').replace('%2F', '/') # Lookup specified engine. engine = SCHEMES[url.scheme] if engine is None else engine port = (str(url.port) if url.port and engine in [SCHEMES['oracle'], SCHEMES['mssql']] else url.port) # Update with environment configuration. config.update({ 'NAME': urlparse.unquote(path or ''), 'USER': urlparse.unquote(url.username or ''), 'PASSWORD': urlparse.unquote(url.password or ''), 'HOST': hostname, 'PORT': port or '', 'CONN_MAX_AGE': conn_max_age, }) # Pass the query string into OPTIONS. options = {} for key, values in query.items(): if url.scheme == 'mysql' and key == 'ssl-ca': options['ssl'] = {'ca': values[-1]} continue options[key] = values[-1] if ssl_require: options['sslmode'] = 'require' # Support for Postgres Schema URLs if 'currentSchema' in options and engine in ( 'django.contrib.gis.db.backends.postgis', 'django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql', 'django_redshift_backend', ): options['options'] = '-c search_path={0}'.format(options.pop('currentSchema')) if options: config['OPTIONS'] = options if engine: config['ENGINE'] = engine return config

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

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

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

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

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

mather

2021/08/10 08:59

dj_database_url のソースコードを記載してください。
guest

回答1

0

ベストアンサー

config()のコード

Returns configured DATABASE dictionary from DATABASE_URL.

とコメントにある通り、データベースの接続情報に関する dict を返す関数のようです。

2つ目の記述方法を次のように変えてみるとほぼ同じことをやっているのがわかると思います。

python

1# dict 2config = { 3 'ENGINE': 'django.db.backends.postgresql_psycopg2', 4 'NAME': 'XXXXXX', 5 'USER': os.environ.get('DB_USER'), 6 'PASSWORD': os.environ.get('DB_PASSWORD'), 7 'HOST': '', 8 'PORT': '', 9} 10 11DATABASES = { 12 'default': config 13}

投稿2021/08/10 09:14

mather

総合スコア6753

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

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

Kazuhiro-ch

2021/08/10 09:32

ご回答ありがとうございます。ではどちらかを削除してもよいということでしょうか?二つ目のコードではPWやIDなど読み込んでいますが、1つ目で読み込まれていないのではと思います。
mather

2021/08/10 09:39

DB_USER, DB_PASSWORD という環境変数の値を読み込んでいるのは2つ目の方ですが、1つ目の方は DATABASE_URL という環境変数を読み込んでいます。 リポジトリのREADMEに記載されています。 https://github.com/jacobian/dj-database-url どちらを使いたいかはご自身の判断で選んでください。
Kazuhiro-ch

2021/08/10 09:41

重複しているため、やはりどちらか選ぶべきなんですね。承知いたしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問