実現したいこと
- [] FlaskでSQLiteを用いてデータベースを作成したい。
発生している問題・分からないこと
DBにデータを登録してそれを参照しようとしたが、根本的にテーブルが作られていないことが分かった。
Docker(docker-compose。backendがFlask、frontendがVue3)を使用しており、backendコンテナ内でsqlite3コマンドによるテーブル確認を行ったが、何も表示されなかった。
該当のソースコード
models.py
1from datetime import datetime 2from flask_sqlalchemy import SQLAlchemy 3from sqlalchemy import desc 4from collections import namedtuple 5 6db = SQLAlchemy() 7 8class Users(db.Model): 9 __tablename__ = 'users' 10 id = db.Column(db.Integer, primary_key=True) 11 username = db.Column(db.String(255)) 12 results = db.relationship('Results', backref='user', lazy=True) 13 14class Results(db.Model): 15 __tablename__ = 'results' 16 id = db.Column(db.Integer, primary_key=True) 17 user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) 18 level = db.Column(db.Text, nullable=False) 19 clearTime = db.Column(db.Integer, nullable=False) 20 collectedCoins = db.Column(db.Integer, nullable=False) 21 timestamp = db.Column(db.DateTime, index=True, default=datetime.now) 22 23def add_user(username): 24 already = db.session.query(Users).filter(Users.username == username) 25 if not already: 26 model = Users(username=username) 27 db.session.add(model) 28 db.session.commit() 29 30def result_post(username, level, collectedCoins, clearTime): 31 user_id = db.session.query(Users).filter(Users.username == username) 32 model = Results( 33 user_id=user_id, 34 level=level, 35 clearTime=clearTime, 36 collectedCoins=collectedCoins 37 ) 38 db.session.add(model) 39 db.session.commit() 40 41 42Ranking = namedtuple('Ranking', [ 43 'result_id', 44 'username', 45 'level', 46 'clear_time', 47 'collected_coins', 48 'timestamp' 49]) 50def get_ranking(): 51 rank5_init = db.session.query( 52 Results.id, 53 Users.username, 54 Results.level, 55 Results.clearTime, 56 Results.collectedCoins, 57 Results.timestamp 58 ).join(Users, Users.id == Results.user_id 59 ).order_by( 60 desc(Results.collectedCoins), 61 desc(Results.clearTime) 62 ).limit(5).all() 63 64 rank5 = [Ranking( 65 result_id=row[0], 66 username=row[1], 67 level=row[2], 68 clear_time=row[3], 69 collected_coins=row[4], 70 timestamp=row[5] 71 ) for row in rank5_init] 72 73 # デバッグ用コード 74 print(f"Retrieved rankings: {rank5}") 75 return rank5
app.py
1from flask import Flask, send_from_directory 2from api import api_bp 3from flask_sqlalchemy import SQLAlchemy 4from models import db 5 6app = Flask(__name__, static_folder='/usr/src/app/frontend/dist', static_url_path="") 7app.register_blueprint(api_bp) 8app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///maze.db' 9app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 10 11db.init_app(app) 12 13@app.route("/", defaults={'path': ''}) 14@app.route('/<path:path>') 15def index(path): 16 return send_from_directory(app.static_folder, "index.html") 17 18if __name__ == '__main__': 19 with app.app_context(): 20 db.create_all() 21 app.run(debug=True, host='0.0.0.0')
Dockerfile(backend)
1FROM python:3.12.2 2 3WORKDIR /usr/src/app 4 5COPY ./ /usr/src/app/ 6COPY ./requirements.txt ./ 7 8RUN pip install --upgrade pip 9RUN pip install --upgrade flask 10RUN pip install -r requirements.txt 11RUN apt-get update && \ 12 apt-get install -y sqlite3 libsqlite3-dev && \ 13 rm -rf /var/lib/apt/lists/* 14RUN pip install flask_sqlalchemy
docker
1services: 2 frontend: 3 build: 4 context: ./frontend 5 dockerfile: Dockerfile 6 command: npm run dev 7 ports: 8 - '5173:5173' 9 volumes: 10 - ./frontend:/usr/src/app 11 backend: 12 build: 13 context: ./backend 14 dockerfile: Dockerfile 15 command: ["python3", "app.py", "--host=0.0.0.0"] 16 ports: 17 - '5000:5000' 18 volumes: 19 - ./backend:/usr/src/app 20 - ./frontend/dist:/usr/src/app/frontend/dist
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
実環境で、似たような構成のアプリケーションを作成したときは問題なかったため、そのコードを参考に開発を進めた。
補足
特になし
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。