@Elephantsdadshusband

Как правильно подключить БД sqlite к приложению на flask, используя SQLAlchemy?

Имеется проект на flask, пытаемся подключить к нему базу данных, но возникают ошибки. О самом проекте:
Структура проекта
5c3f0e8e9f528923080415.png


Файл chat.py:
from app import create_app, socketio
app = create_app(debug=True)
if __name__ == '__main__':
    socketio.run(app)


Файл app\__init__.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO

socketio = SocketIO()
db = SQLAlchemy()

def create_app(debug=False):
    """Create an application."""
    app = Flask(__name__)
    app.debug = debug
    app.config['SECRET_KEY'] = 'gjr39dkjn344_!67#'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'

    db.init_app(app)
    socketio.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app


app\main\__init__.py:
from flask import Blueprint
main = Blueprint('main', __name__)
from . import routes, events

app\models.py:
from datetime import datetime
from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(15), nullable=False)
    session_id = db.Column(db.String(200), nullable=False)
    isready = db.Column(db.Boolean, default='False')
    room = db.relationship('Rooms', backref='spy')
    def __repr__(self):
        return f"User('{self.username}')"

class Location(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(15), nullable=False)
    image_file = db.Column(db.String(20))
    rooms = db.relationship('Rooms', backref='place')
    def __repr__(self):
        return f"Location('{self.name}', '{self.image_file}')"

chats = db.Table('chats',
    db.Column('room_id', db.Integer, db.ForeignKey('rooms.id')),
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'))
    )

class Rooms(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    s_id = db.Column(db.String(200), nullable=False)
    status = db.Column(db.String(20), nullable=False)
    start_time = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    location_id = db.Column(db.Integer, db.ForeignKey('location.id'))
    spy_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    players = db.relationship('User', secondary=chats, backref=db.backref('chatroom'))

    def __repr__(self):
        return f"Rooms('{self.location}', '{self.spy}')"


Через терминал пытаюсь подключиться к базе и добавить запись таким набором команд:
from app import db, create_app
db.create_all(app=create_app())
from app.models import User, Rooms, Location, chats
loc_1 = Location(name='Музей', image_file='location 1.png')
db.session.add(loc_1)

Выдает ошибку
RuntimeError: No application found. Either work inside a view function or push an application


В документации ничего, что помогло бы, не нашлось, на других q/a площадках тоже ничего. Решения аналогичных проблем не помогают. Есть идеи, как это решить?
  • Вопрос задан
  • 2402 просмотра
Пригласить эксперта
Ответы на вопрос 1
de-iure
@de-iure
just a crazy lawyer
вот тут посмотрите: https://habr.com/ru/post/346344/

и миграцию базы вы видимо не сделали, в структуре нет файла site.db, да и путь к базе у вас странный... в общем читайте по ссылке, я думаю все получится, сложного у вас ничего нет (дополнительно посмотрите 15 тему)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы