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

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

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

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

4326閲覧

「sqlalchemy.exc.ProgrammingError」が出る

mmtt

総合スコア23

PostgreSQL

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/30 09:11

前提・実現したいこと

Flaskで作成しているwebアプリにログイン機能を実装したい。
DBはpostgreSQL、フレームワークはFlaskを用いています。

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

/signupにアクセスは出来るものの、usernameとpasswordを入力し、「送信」を押すと下記のエラーが出てしまいます。原因と解決方法を教えていただければ嬉しいです。よろしくお願いいたします。

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "user" does not exist LINE 1: INSERT INTO "user" (username, password) VALUES ('t', 'sha256... ^ [SQL: INSERT INTO "user" (username, password) VALUES (%(username)s, %(password)s) RETURNING "user".id] [parameters: {'username': 't', 'password': 'sha256$256g8V7vekMAAADC$bd440dd7dfecfcb7e1cbc3283238f3e1d41a0cd8d1d4d5fc43a9638e624f1066'}] (Background on this error at: https://sqlalche.me/e/14/f405)

該当のソースコード

python

1from flask import Flask, render_template, request, redirect, session 2from flask_sqlalchemy import SQLAlchemy 3from flask_login import UserMixin, LoginManager, login_user, logout_user, login_required 4from werkzeug.security import generate_password_hash, check_password_hash 5import psycopg2 6import reload 7import random 8 9app = Flask(__name__) 10app.config['SECRET_KEY'] = 'xxxxxx' 11app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///shikaq.db' 12app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 13db = SQLAlchemy(app) 14 15login_manager = LoginManager() 16login_manager.init_app(app) 17 18 19@login_manager.user_loader 20def load_user(user_id): 21 return User.query.get(int(user_id)) 22 23 24class User(UserMixin, db.Model): 25 id = db.Column(db.Integer, primary_key=True) 26 username = db.Column(db.String(50), nullable=False, unique=True) 27 password = db.Column(db.String(25)) 28 29@app.route('/signup', methods=['GET', 'POST']) 30def signup(): 31 if request.method == "POST": 32 username = request.form.get('username') 33 password = request.form.get('password') 34 # Userのインスタンスを作成 35 user = User(username=username, password=generate_password_hash(password, method='sha256')) 36 db.session.add(user) 37 db.session.commit() 38 return redirect('/login') 39 else: 40 return render_template('signup.html') 41 42 43@app.route('/login', methods=['GET', 'POST']) 44def login(): 45 if request.method == "POST": 46 username = request.form.get('username') 47 password = request.form.get('password') 48 # Userテーブルからusernameに一致するユーザを取得 49 user = User.query.filter_by(username=username).first() 50 if check_password_hash(user.password, password): 51 login_user(user) 52 return redirect('/') 53 else: 54 return render_template('login.html') 55 56 57@app.route('/logout') 58@login_required 59def logout(): 60 logout_user() 61 return redirect('/login')

試したこと

https://docs.sqlalchemy.org/en/14/errors.html#error-f405
エラーメッセージを読み、DBとの接続が上手くいっていないのは理解したのですが、原因、解決方法が分からず質問させていただいています。

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

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

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

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

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

guest

回答1

0

relation "user" does not exist LINE 1: INSERT INTO "user" ^

ですので、 user テーブルが存在しないのかな?と思いました。

Quoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case. For example, the identifiers FOO, foo, and "foo" are considered the same by PostgreSQL, but "Foo" and "FOO" are different from these three and each other. (The folding of unquoted names to lower case in PostgreSQL is incompatible with the SQL standard, which says that unquoted names should be folded to upper case. Thus, foo should be equivalent to "FOO" not "foo" according to the standard. If you want to write portable applications you are advised to always quote a particular name or never quote it.)
(また、識別子をクォートすると大文字と小文字が区別されますが、クォートされていない名前は常に小文字に折り返されます。例えば、FOO、foo、"foo "という識別子はPostgreSQLでは同じものとみなされますが、"Foo "と "FOO "はこれら3つと互いに異なるものです。(PostgreSQLにおける引用符で囲まれていない名前の小文字への変換は、引用符で囲まれていない名前は大文字に変換されるべきであるという標準SQLと互換性がありません。したがって、標準によれば、fooは "foo "ではなく "FOO "と等価であるべきです。もし移植可能なアプリケーションを書きたいのであれば、特定の名前を常に引用符で囲むか、あるいは決して引用符で囲まないことをお勧めします)。)

https://www.postgresql.org/docs/current/sql-syntax-lexical.html

「識別子をクォートすると大文字と小文字が区別されます」のようですので、PostgreSQLのテーブルの名前が小文字で user となっているか確認してみると良いかもしれません。


To create the initial database, just import the db object from an interactive Python shell and run the SQLAlchemy.create_all() method to create the tables and database:
(初期のデータベースを作るには、対話型 Python シェルから db オブジェクトをインポートし、 SQLAlchemy.create_all() メソッドを実行して、テーブルとデータベースを作成するだけです。)

py

1>>> from yourapplication import db 2>>> db.create_all()

https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/#a-minimal-application

データベースとテーブルはどのように作成されましたでしょうか?
SQLAlchemy.create_all()で作成すると今回のような問題が起こってしまいますでしょうか?


Some parts that are required in SQLAlchemy are optional in Flask-SQLAlchemy. For instance the table name is automatically set for you unless overridden. It’s derived from the class name converted to lowercase and with “CamelCase” converted to “camel_case”. To override the table name, set the __tablename__ class attribute.
(SQLAlchemy では必須である部分が、Flask-SQLAlchemy ではオプションになっています。例えばテーブル名は、オーバーライドされない限り、自動的に設定されます。これは、クラス名を小文字に変換し、"CamelCase" を "camel_case" に変換したものから派生しています。テーブル名をオーバーライドするには、__tablename__ クラス属性を設定します。)

https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/

モデルのクラス属性をオーバーライドすることもできるようです。

py

1class User(UserMixin, db.Model): 2 __tablename__ = "テーブル名"

投稿2022/01/30 13:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問