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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

349閲覧

makemigrationの際に'utf-8' codec can't decode byteというエラーが出る

coffeebar

総合スコア140

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2024/02/26 00:05

編集2024/02/26 00:30

実現したいこと

PyCharmでmakemigrationを行った時に、エラー無く、migrationファイルが作成できるようにしたい。
下記のエラーの原因は「ファイル内にutf-8でない文字コードが紛れ込んでいる」という理解であっていますか?
もし、それで合っているとしたら、それをPyCharmを使ったりして調べる方法はありますか?(本サンプル・プログラムで作成したファイルをPyCharm上で見てみたのですが、文字化けしている箇所は無いようなのですが。)

発生している問題・分からないこと

『動かして学ぶ!Python Django開発入門(第2版)』を勉強しています。p246「django-allauth用のマイグレーションを行う」のところで下記エラーが出てしまいました。
p217「マイグレーションを行う」時点ではエラーは出ていませんでした。
どのファイルのどの行がエラーなのか分からず(manage.pyのline 19,23が原因とは思えない)、試行錯誤の方向性がわかりません。

エラーメッセージ

error

1C:\Users\user\venv_private_diary\Scripts\python.exe C:\Users\user\venv_private_diary\private_diary\manage.py makemigrations 2Traceback (most recent call last): 3 File "C:\Users\user\venv_private_diary\private_diary\manage.py", line 23, in <module> 4 main() 5 File "C:\Users\user\venv_private_diary\private_diary\manage.py", line 19, in main 6 execute_from_command_line(sys.argv) 7 File "C:\Users\user\venv_private_diary\Lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line 8 utility.execute() 9(中略) 10 File "C:\Users\user\venv_private_diary\Lib\site-packages\psycopg2\__init__.py", line 122, in connect 11 conn = _connect(dsn, connection_factory=connection_factory, **kwasync) 12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 13UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 69: invalid start byte 14 15プロセスは終了コード 1 で終了しました 16 17(中略)の部分はFile "C:\Users\user\venv_private_diary\Lib\site-packages\django\… 18というdjangoのファイルが並んでいます

該当のソースコード

python

1#!/usr/bin/env python 2"""Django's command-line utility for administrative tasks.""" 3# -*- coding: utf-8 -*- 4import os 5import sys 6 7 8def main(): 9 """Run administrative tasks.""" 10 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'private_diary.settings') 11 try: 12 from django.core.management import execute_from_command_line 13 except ImportError as exc: 14 raise ImportError( 15 "Couldn't import Django. Are you sure it's installed and " 16 "available on your PYTHONPATH environment variable? Did you " 17 "forget to activate a virtual environment?" 18 ) from exc 19 execute_from_command_line(sys.argv) ←line19 20 21 22if __name__ == '__main__': 23 main() ←line23 24

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

上記の様に、manage.py内に

-- coding: utf-8 --

の一行を追加した。→同じエラー

本に書かれている内容で重要そうな箇所を、コード内にコメントとして書いていた部分を消した。→同じエラー

補足

特になし

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

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

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

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

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

dameo

2024/02/26 04:05

これアプリケーション動いてデータベースにアクセス出来てますか? settings.pyのデータベース設定にシフトJISが混じってそうな感じに見えます。
coffeebar

2024/02/27 06:56 編集

コメントありがとうございます。 runserverやshowmigrationsを行っても、同じエラーがでてしまいます。ブラウザでアクセスしようとしても「このサイトにアクセスできません127.0.0.1 で接続が拒否されました。」というエラーです。 仮想環境を構築しなおして、この本のサイトからサンプルファイルをダウンロードして、Chapter10フォルダの中身をコピペしても、同じ結果なので 呆然としています。(←この方法でダメということは、シフトJISの混入等とは考えにくくなってきました。)
dameo

2024/02/27 08:05

原因は間違いなく文字コードですが、本を持っていないので、正確に再現することが出来ません。 10章とやらをやっているようですが、他の章は順番にやってきていますか? 多少設定をいじったりインストールしたりはしているので、そこが本と同じか分かりませんが(あとpostgresqlを使うのは面倒だったのでsqlite3にしてますが)とりあえず動いてますよ。 ブラウザで見ると「あなた専用の日記保存サービス」とやらが綺麗なデザインで表示されています。
coffeebar

2024/02/27 09:23

10章は「djangoに認証機能を追加する」というものです。第1章から順番にやっており、こういうエラーはでなかったのですが、この章でつまづきました。 ↑のように著者作成のサンプルファイルをChapter9に戻してみたのですが、それでもダメです。もう訳が分かりません。
dameo

2024/02/27 10:34

とりあえずvenvらしき環境に入ってから ・python --version ・pip freeze の結果と、中略を略さないエラー出力を貼ってください。まずはそこからですね。
coffeebar

2024/02/27 10:39

Python 3.12.1 asgiref==3.7.2 certifi==2024.2.2 cffi==1.16.0 charset-normalizer==3.3.2 cryptography==42.0.5 defusedxml==0.7.1 Django==5.0.2 django-allauth==0.61.1 django-bootstrap5==23.4 idna==3.6 oauthlib==3.2.2 psycopg2-binary==2.9.9 pycparser==2.21 PyJWT==2.8.0 python3-openid==3.2.0 requests==2.31.0 requests-oauthlib==1.3.1 sqlparse==0.4.4 tzdata==2024.1 urllib3==2.2.1 C:\Users\user\venv_private_diary\Scripts\python.exe C:\Users\user\venv_private_diary\private_diary\manage.py makemigrations Traceback (most recent call last): File "C:\Users\user\venv_private_diary\private_diary\manage.py", line 22, in <module> main() File "C:\Users\user\venv_private_diary\private_diary\manage.py", line 18, in main execute_from_command_line(sys.argv) File "C:\Users\user\venv_private_diary\Lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line utility.execute() File "C:\Users\user\venv_private_diary\Lib\site-packages\django\core\management\__init__.py", line 436, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\Users\user\venv_private_diary\Lib\site-packages\django\core\management\base.py", line 413, in run_from_argv self.execute(*args, **cmd_options) File "C:\Users\user\venv_private_diary\Lib\site-packages\django\core\management\base.py", line 459, in execute output = self.handle(*args, **options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\core\management\base.py", line 107, in wrapper res = handle_func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\core\management\commands\makemigrations.py", line 158, in handle loader.check_consistent_history(connection) File "C:\Users\user\venv_private_diary\Lib\site-packages\django\db\migrations\loader.py", line 313, in check_consistent_history applied = recorder.applied_migrations() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\db\migrations\recorder.py", line 89, in applied_migrations if self.has_table(): ^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\db\migrations\recorder.py", line 63, in has_table with self.connection.cursor() as cursor: ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\db\backends\base\base.py", line 316, in cursor return self._cursor() ^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\db\backends\base\base.py", line 292, in _cursor self.ensure_connection() File "C:\Users\user\venv_private_diary\Lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\db\backends\base\base.py", line 275, in ensure_connection self.connect() File "C:\Users\user\venv_private_diary\Lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\db\backends\base\base.py", line 256, in connect self.connection = self.get_new_connection(conn_params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\django\db\backends\postgresql\base.py", line 277, in get_new_connection connection = self.Database.connect(**conn_params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\venv_private_diary\Lib\site-packages\psycopg2\__init__.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 69: invalid start byte プロセスは終了コード 1 で終了しました となりました
dameo

2024/02/27 11:32

https://www.shoeisha.co.jp/book/detail/9784798174198 の付属データからサンプルをダウンロード 10章のprivate_diaryフォルダへ venv環境を作成し、環境に入ってから、pip install -rでfreezeしたバージョンのパッケージをインストール private_diary/settings_common.py: MIDDLEWAREにallauth.account.middleware.AccountMiddlewareを追加 private_diary/settings_dev.py: SECRET_KEYに適当な鍵文字列を記述 localhostでpostgresqlを配置し、private_diaryというDBを作成 set DB_USER=postgresqlのユーザー名 set DB_PASSWORD=postgresqlのパスワード python manage.py runserver --settings private_diary.settings_devを実行 で起動した。
dameo

2024/02/27 11:47

一応言っておくと、本のホームページ上にはdjangoのバージョンは3.2とあるのに、お使いのバージョンが5だったので、いろいろおかしい可能性はある。まあ最初のページは動いてるし、質問のエラーとは関係ないと思うけど。
dameo

2024/02/29 05:14

本件まだ解決できてないのでしょうか? きちんと言っておくと、makemigrationsもmigrateも成功し、起動もしますよ。 つまり、最初に言ったとおり、あなたが編集したファイルのいずれかにシフトJISが混入しているだけの可能性が高く、エラーからはsettings.py辺りが疑われます。 あなたが質問した状況を再現する手順を正確に記載するか、私の手順で問題が起こるのかどうかを確認する必要がありますよね? いずれも行わずに放置する場合は私も環境を消して、以降対応をやめますが…
coffeebar

2024/03/01 02:31

dameo様 大変申し上げにくいのですが、このコメントも含め 私の質問への回答・コメントは、今後お控え願えますよう、お願い申し上げます。
guest

回答1

0

自己解決

初歩的なミスでした。調べていただいた方々、申し訳ありませんでした。
原因はDB_PASSWORDの設定ミスでした(間違ったパスワードを入れていました。)
DBにアクセスしようと試みる→パスワードが間違っている旨のエラーがUTF-8以外の文字コードで吐かれる→Djangoが「UTF-8じゃないから読めないよ」というエラーを出す
ということだったみたいです。

投稿2024/03/01 02:37

coffeebar

総合スコア140

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

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

dameo

2024/03/01 04:57

Windowsにpostgresqlを日本語ロケールでインストールしたということですね。 私はWindows内で動いているLinux上にdockerでpostgresqlを動かしており、パスワードも間違っていなかったため、気付きませんでした。 ただよく考えたらpython3は内部的に文字列がUnicodeであるため、文字列にした時点でエラーになることから、エラーになるならドライバより前のはずでしたね。 psycopg2のエラーなら返ってきた文字列であると気付くべきだったかもしれません。 とはいえ、エラーメッセージが化けること自体は問題なので、原因を少し調べてみました。 https://github.com/psycopg/psycopg2/issues/1442 元々postgresqlが接続後でないとエンコーディングの指定が出来ないプロトコルなのに、接続エラーをロケール依存メッセージにしてしまうことが問題のようで、psycopg2を使う場合、このエラーになるようです。 psycopg3を使う場合、接続文字列(DSN)のエンコーディング指定(client_encoding)にサーバーロケールのエンコーディング(今回はSJIS)を使うことで、エラーメッセージをそのエンコーディングに仮定するようです。 一応後からコマンドとしてset client_encoding to UTF8などをすればUTF-8にも変更出来るようですが、以下のコードでは一部文字化けしていました。 import psycopg conn = psycopg.connect("dbname=postgres user=postgres password=hoge client_encoding=SJIS") conn.execute("set client_encoding to UTF8") conn.execute('hoge') # hogeなどというコマンドはpostgresにはない 上記を以下で実行 python hoge.py 2>error.txt [error.txtの中身] Traceback (most recent call last): File "C:\Users\user\python\psycopg2test\hoge.py", line 4, in <module> conn.execute('hoge') File "C:\Users\user\python\psycopg2test\env\Lib\site-packages\psycopg\connection.py", line 891, in execute raise ex.with_traceback(None) psycopg.errors.SyntaxError: "hoge"また㜵fffd¯そ㜵fffd®近辺で構文エラー LINE 1: hoge ^ なので、結論としては現時点ではpsycopgを使う場合、PostgreSQLサーバーを日本語でセットアップすることはオススメしません。またUnix系のOSで動かした方がこの手のトラブルに遭遇する確率は下がるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問