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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQLAlchemy

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

Python

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

Q&A

解決済

1回答

567閲覧

(sqlite3.OperationalError) table user has no column named passwordで進めない。

1957151

総合スコア2

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQLAlchemy

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

Python

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

0グッド

0クリップ

投稿2023/03/13 04:05

実現したいこと

ブログアプリの動作確認をしたい。

前提

Flaskでブログアプリを作成しようとしています。
signup機能を作り終わりました。そこで、ユーザー名とパスワードの両方を”a”入れて新規登録ボタンを押したところ以下のエラーが発生しました。

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

エラーメッセージ
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) table user has no column named password
[SQL: INSERT INTO user (username, password) VALUES (?, ?)]
[parameters: ('a', 'sha256$Y8vcCVMLjz5Ztb0d$6e4b06e517c511fa4b5bbec390ec01dcfb71ae3e2d4616c979912d3344c0327b')]
(Background on this error at: https://sqlalche.me/e/14/e3q8)

app.py

1### 該当のソースコード 2```from enum import unique 3from flask import Flask 4from flask import render_template, request, redirect 5from flask_sqlalchemy import SQLAlchemy 6from flask_login import UserMixin, LoginManager, login_user, logout_user, login_required 7from werkzeug.security import generate_password_hash, check_password_hash 8import os 9 10from datetime import datetime 11import pytz 12 13app = Flask(__name__) 14app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db' 15app.config['SECRET_KEY'] = os.urandom(24) 16db = SQLAlchemy(app) 17 18login_manager = LoginManager() 19login_manager.init_app(app) 20 21class Post(db.Model): 22 id = db.Column(db.Integer, primary_key=True) 23 title = db.Column(db.String(30), nullable=False) 24 body = db.Column(db.String(300), nullable=False) 25 created_at = db.Column(db.DateTime, nullable=False, default=datetime.now(pytz.timezone("Asia/Tokyo"))) 26 27class User(UserMixin, db.Model): 28 id = db.Column(db.Integer, primary_key=True) 29 username = db.Column(db.String(30), unique=True) 30 password = db.Column(db.String(12)) 31 32@login_manager.user_loader 33def load_user(user_id): 34 return User.query.get(int(user_id)) 35 36@app.route('/', methods=['GET','POST'])#POST:何かを新規作成したときに用いる:formを送信したときなどGET:webページにアクセスしているときに使用する 37@login_required 38def index(): 39 if request.method == 'GET': 40 posts = Post.query.all() 41 return render_template('index.html', posts=posts) 42 43@app.route('/signup', methods=['GET', 'POST']) 44def signup(): 45 if request.method == 'POST': 46 username = request.form.get('username') 47 password = request.form.get('password') 48 49 user = User(username=username, password=generate_password_hash(password, method='sha256')) 50 51 db.session.add(user) 52 db.session.commit() 53 return redirect('/login') 54 else: 55 return render_template('signup.html') 56 57@app.route('/login', methods=['GET','POST']) 58def login(): 59 if request.method == 'POST': 60 username = request.form.get('username') 61 password = request.form.get('password') 62 63 user = User.query.filter_by(username = username).first() 64 if check_password_hash(user.password, password): 65 login_user(user) 66 return redirect('/') 67 else: 68 return render_template('login.html') 69 70@app.route('/logout') 71@login_required #loginしているユーザーしかログインできない 72def logout(): 73 logout_user() 74 return redirect('/login') 75 76@app.route('/create', methods=['GET','POST']) 77@login_required 78def create(): 79 if request.method == 'POST': 80 title = request.form.get('title') 81 body = request.form.get('body') 82 83 post = Post(title=title, body=body) 84 85 db.session.add(post) 86 db.session.commit() 87 return redirect("/") 88 else: 89 return render_template('create.html') 90 91@app.route('/<int:id>/update', methods=['GET','POST']) 92@login_required 93def update(id): 94 post = Post.query.get(id) 95 if request.method == 'GET': 96 return render_template('update.html', post=post) 97 else: 98 post.title = request.form.get('title') 99 post.body = request.form.get('body') 100 101 db.session.commit() 102 return redirect("/") 103 104@app.route('/<int:id>/delete', methods=['GET']) 105@login_required 106def delete(id): 107 post = Post.query.get(id) 108 109 db.session.delete(post) 110 db.session.commit() 111 return redirect('/') 112

signup.html

試したこと

https://sqlalche.me/e/14/e3q8 からマイグレーションできていない可能性があると考えたため以下を試しましたが解決には至らなかったです。

bash

1>>> from app import app 2>>> from app import db 3>>> with app.app_context(): 4... db.create_all()

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

windows 10
Python 3.9.12
flask 2.2.3
flask-sqlalchemy 3.0.3
sqlite 3.38.2
模写した動画です。(https://www.youtube.com/watch?v=VtJ-fGm4gNg)
どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

実行してみましたが、質問に書いてある現象が発生しませんでした。

DBが無いか、テーブルが無いか、カラムが無いかのいずれかなんじゃ無いかと思うので、以下を確認ください。

  1. 書いてある通りに実行した場合、 instance/blog.dbが作成されていると思います。
    存在するか確認ください。
  2. instance/blog.dbが存在する場合、userテーブルが作成できているか確認ください。
  3. userテーブルが作成出来ている場合、カラムがid, username, passwordである事を確認ください。

instance/blog.dbがある場合は、とりあえず削除して、以下を再実行して作り直してみてはいかがでしょうか。

>>> from app import app >>> from app import db >>> with app.app_context(): ... db.create_all()

投稿2023/03/13 10:53

FiroProchainezo

総合スコア2402

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

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

1957151

2023/03/13 11:41

回答して頂きありがとうございます。 instance/blog.dbを削除して再実行したらうまく表示されました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問