dev_suzu
@dev_suzu (dev suzu)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Flask Postgresql データ表示

前提

現在教本を元にFlaskでデータベースの中身を表示するシステムを作っています。
表示機能を実装中にエラーメッセージが発生しました。

実現したいこと

Postgresqlに接続してデータベースの中を表示する機能を動作するようにしたいです。

発生している問題・エラーメッセージ

  File "c:\users\hoge\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 2091, in __call__
    return self.wsgi_app(environ, start_response)
  File "c:\users\hoge\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 2076, in wsgi_app
    response = self.handle_exception(e)
  File "c:\users\hoge\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 2073, in wsgi_app
    response = self.full_dispatch_request()
  File "c:\users\hoge\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 1518, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "c:\users\hoge\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 1516, in full_dispatch_request
    rv = self.dispatch_request()
  File "c:\users\hoge\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 1502, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "C:\Users\hoge\Desktop\flask\ansaa.xyz\ansaa.py", line 14, in index
    cur.execute('SELECT * FROM messages')
  File "c:\users\hoge\appdata\local\programs\python\python36\lib\site-packages\psycopg2\extras.py", line 146, in execute
    return super().execute(query, vars)
psycopg2.errors.UndefinedTable: リレーション"messages"は存在しません
LINE 1: SELECT * FROM messages

該当のソースコード

ansaa.py
from flask import Flask,request,render_template
import psycopg2
import psycopg2.extras

app = Flask(__name__)
if __name__ == '__main__':
    app.run(debug=True) 

conn = psycopg2.connect(host='localhost',port='5432',dbname='testdb',user='postgres',password='hogehoeg')
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

@app.route('/',methods=['GET'])
def index():
    cur.execute('SELECT * FROM messages')
    messages = cur.fetchall()
    messages = [dict(message) for message in messages]
    return render_template('index.html',messages=messages)
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        {% for msg in messages %}
        <h2>{{msg.username}}</h2>
        <p>{{msg.message}}</p>
        {% endfor %}
    </div>
</body>
</html>
postgres=# \l
                                             データベース一覧
   名前    |  所有者  | エンコーディング |      照合順序      | Ctype(変換演算子)  |     アクセス権限
-----------+----------+------------------+--------------------+--------------------+-----------------------
 postgres  | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
 template0 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |          |                  |                    |                    | postgres=CTc/postgres
 template1 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |          |                  |                    |                    | postgres=CTc/postgres
 testdb    | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
postgres=# \d messages
                         テーブル"public.messages"
    列    |         タイプ         | 照合順序 | Null 値を許容 | デフォルト
----------+------------------------+----------+---------------+------------
 username | character varying(64)  |          |               |
 message  | character varying(140) |          |               |

試したこと

テーブル名や記述ミスが無いか確認したのですが見あたりませんでした。
また、CMDからデータベースに接続出来るか下記コマンドで検証して接続できました。

C:\Users\hoge>psql -U postgres -d testdb -h 127.0.0.1 -p 5432
ユーザー postgres のパスワード:
psql (14.6)
"help"でヘルプを表示します。
testdb=#

スキーマという概念がある事をしり確認してみましたがpublic以外表示されませんでした。

postgres=# select current_schema;
 current_schema
----------------
 public
(1 行)

postgres=# \dn
   スキーマ一覧
  名前  |  所有者
--------+----------
 public | postgres
(1 行)

原因の切り分け方法等ご教示いただけますと幸いです。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Windows10 pro
postgresql SQL 14

0

1Answer

SELECT * FROM messages
psql -U postgres -d testdb -h 127.0.0.1 -p 5432
conn = psycopg2.connect(host='localhost',port='5432',dbname='testdb',user='postgres',password='hogehoeg')

127.0.0.1とlocalhostは古い時代ipの世界では同じでした。

また、postgresqlはpg_hba.confで疎通設定する必要があります。

0Like

Comments

  1. @dev_suzu

    Questioner

    ご回答ありがとうございます。
    参考させて頂きます。

Your answer might help someone💌