flaskを用いて家計簿のようなものを作成しようとしたのですが、外部キー制約の設定ができません。
プログラミング言語はpython,アプリケーションを作るためにflaskを使用し、データベース操作のために
pythonのormであるflask-sqlalchemyを使っています。
アプリケーションの概要ですが、まず、日用品や交際費などのようにジャンル別にカテゴリーを作成し、カテゴリーごとの予算を設定します。お金を使うごとに何にお金をどれくらい使ったかを記録し、それらの情報をウェブページ上に載せるというものです。なお一番下にpythonのコードすべてを載せています。
(HTMLは割愛)
データベースですが、Categoryというクラスにカテゴリーの情報を、Detailというクラスにお金を使用したときの情報を入れておきたいと考えています。また、これら二つのクラスをカテゴリ名を用いて一対多リレーションシップとしてデータベースを作成したいと考えています。
こちらがflask-sqlalchemyの公式ドキュメントのDeclearing Modelsのone to many relationshipを参考に作ったデータベースです。
python
1class Category(db.Model): 2 name = db.Column(db.String,db.ForeignKey('name'),primary_key=True) 3 budget = db.Column(db.Integer,nullable=False) 4 remaining_budget = db.Column(db.Integer,nullable=False) 5 month = db.Column(db.Integer,nullable=False) 6 7class Detail(db.Model): 8 id = db.Column(db.Integer,primary_key=True) 9 name = db.relationship('Category',backref='Detail',lazy=True) 10 used_money = db.Column(db.Integer,nullable=False) 11 purchased_item = db.Column(db.String,nullable=False) 12 date = db.Column(db.String,nullable=False) 13
こちらを実行すると出てきたエラー文がこちらです。
sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Detail.name - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.
エラー文を見るに、二つのテーブルをつなぐ外部キーがないとされているようですが、公式ドキュメント通りに外部キー制約を設定しているつもりなので、なぜこのようなことが起きているのかさっぱりわかりません。データベースについても勉強中なので根本的な間違いなのかもしれません。
なぜこのエラーが起きているのか、そしてその対応策を教えていただきたいです。
pythonのコード
python
1from flask import Flask 2from flask import render_template,redirect,request,session 3from flask_sqlalchemy import SQLAlchemy 4from flask_migrate import Migrate 5import os 6import datetime 7 8app = Flask(__name__) 9app.config['AQLALCHEMY_DARABASE_URI'] = 'sqlite:///database.db' 10db = SQLAlchemy(app) 11migrate = Migrate(app,db) 12today = datetime.date.today() 13 14class Category(db.Model): 15 name = db.Column(db.String,db.ForeignKey('name'),primary_key=True) 16 budget = db.Column(db.Integer,nullable=False) 17 remaining_budget = db.Column(db.Integer,nullable=False) 18 month = db.Column(db.Integer,nullable=False) 19 20class Detail(db.Model): 21 id = db.Column(db.Integer,primary_key=True) 22 name = db.relationship('Category',backref='Detail',lazy=True) 23 used_money = db.Column(db.Integer,nullable=False) 24 purchased_item = db.Column(db.String,nullable=False) 25 date = db.Column(db.String,nullable=False) 26 27@app.route('/') 28def index(): 29 display_categorys = Category.query.filter_by(month = today.month).all() 30 display_details = Category.query.filter_by(month = today.month).all() 31 month = today.month 32 day = today.day 33 return render_template('index.html',categorys=display_categorys,details=display_details,this_month=month,day=day) 34 35 36@app.route('/create_category' ,methods=['GET','POST']) 37def create_category(): 38 if request.method == 'GET': 39 return render_template('create_category.html') 40 else: 41 category_name = request.form.get('category_name') 42 budget = request.form.get('budget') 43 add_category = Category(category_name=category_name,budget=budget) 44 db.session.add(add_category) 45 db.session.commit() 46 return redirect('/index') 47 48@app.route('/create_detail' ,methods=['GET','POST']) 49def create_detail(): 50 if request.method == 'GET': 51 return render_template('create_detail.html') 52 else: 53 purchased_item = request.form.get('purchased_item') 54 used_money = request.form.get('used_money') 55 add_detail = Detail(purchased_item=purchased_item,used_money=used_money) 56 db.session.add(add_detail) 57 db.session.commit() 58

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/14 11:39
2022/06/14 12:31
2022/06/20 02:38