«Ошибка: нет такой команды 'db'» из «flask db init»

Я создаю приложение Flask на MacOS Sonoma 14.4.1 и коде Visual Studio, используя SQLAlchemy с sqlite3. При попытке инициализировать и создать таблицы с помощью flask db init я получаю:

Usage: flask [OPTIONS] COMMAND [ARGS]...
Try 'flask --help' for help.

Error: No such command 'db'.

Дерево проекта:

document_management_system/
|–– backend/
|   |–– pycache/
|   |   |––__init__.cpython-312.pyc
|   |–– app/
|   |   |–– pycache/
|   |       |––__init__.cpython-312.pyc
|   |   |–– __init__.py
|   |   |–– config.py
|   |   |–– models.py
|   |–– venv/
|   |   |–– . . .
|   |–– app.py
|–– frontend/
|   |–– (empty)

Вывод из pip list:

Package           Version
----------------- -------
alembic           1.13.1
blinker           1.7.0
click             8.1.7
Flask             3.0.3
Flask-CLI         0.4.0
Flask-Migrate     4.0.7
Flask-SQLAlchemy  3.1.1
greenlet          3.0.3
itsdangerous      2.2.0
Jinja2            3.1.3
Mako              1.3.3
MarkupSafe        2.1.5
pip               24.0
SQLAlchemy        2.0.29
typing_extensions 4.11.0
Werkzeug          3.0.2

Мои файлы:

# app.py
from flask import Flask, request, jsonify
from flask_migrate import Migrate
from app.config import Config
from app.models import db, Document

def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)

    db.init_app(app)
    migrate = Migrate(app, db)
    migrate.init_app(app, db)

    @app.route('/upload', methods=['POST'])
    def upload_document():
        id=request.form['id']
        name = request.form['name']
        category = request.form['category']
        file_path = request.form['file_path']
        document = Document(id=id, name=name, category=category, file_path=file_path)
        document.save_to_db()
        return jsonify({'message': 'File uploaded successfully'}), 200

    # Document Deletion Endpoint
    @app.route('/delete/<int:document_id>', methods=['DELETE'])
    def delete_document(document_id):
        document = Document.query.get_or_404(document_id)
        document.delete_from_db()
        return jsonify({'message': 'Document deleted successfully'}), 200

    # Search Endpoint
    @app.route('/search')
    def search_documents():
        # Implement search functionality based on query parameters
        # Example: search by document name
        name = request.args.get('name')
        if name:
            documents = Document.query.filter(Document.name.ilike(f'%{name}%')).all()
            return jsonify([document.serialize() for document in documents])
        else:
            return jsonify({'error': 'Missing query parameter "name"'}), 400

    @app.route('/')
    def hello():
        return 'Hello, World!'

    return app

if __name__ == '__main__':
    app = create_app()
    app.run(debug=True)
# config.py
import os

basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'db.sqlite3')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
# models.py
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Document(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), nullable=False)
    category = db.Column(db.String(64), nullable=False)
    file_path = db.Column(db.String(256), nullable=False)
    upload_date = db.Column(db.DateTime, nullable=False, default=datetime.now(datetime.UTC))

    # upload functionality
    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

    # delete functionality
    def delete_from_db(self):
        db.session.delete(self)
        db.session.commit()

Как мне завершить настройку базы данных для выполнения операций CRUD?

Удаление и переустановка моей папки venv и зависимостей, убийство терминала, а также запуск flask --app flaskr init-db и pip3 install flask-migrate --upgrade не сработали. Я удалил Flask, но никаких изменений не произошло. Я запустил export FLASK_APP=app.py затем flask shell, чтобы создать его вручную, но получил:

Ошибка: не удалось найти приложение в модуле «backend.app». Вы уверены, что он содержит приложение Flask? Возможно, вы обернули его в промежуточное программное обеспечение WSGI или используете заводскую функцию.

Запуск export FLASK_APP=app.py:create_app, затем flask shell производит:

ModuleNotFoundError: нет модуля с именем «приложение».

export FLASK_APP=backend.app и export FLASK_APP=backend.app:create_app, за которыми следует flask shell, оба производят:

ModuleNotFoundError: нет модуля с именем «бэкэнд».

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
216
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В каталоге backend введите следующую команду, чтобы запустить оболочку Flask:

flask shell

Импортируйте базу данных и создайте таблицы:

from app.models import db
db.create_all()

См. https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/

Я пытался это сделать, но получаю ModuleNotFoundError: No module named 'backend' то же самое, что и при попытке flask db init, и пока не понял почему

Dennis Arimi 25.04.2024 19:21
Ответ принят как подходящий

я начал проект заново и изменил структуру проекта. сейчас

dms/
|–– backend/
|   |–– flask_app/
|   |   |–– pycache/
|   |       |–– __init__.cpython-312.pyc
|   |       |–– app.cpython-312.pyc
|   |       |–– config.cpython-312.pyc
|   |       |–– models.cpython-312.pyc
|   |   |–– __init__.py
|   |   |–– app.py
|   |   |–– config.py
|   |   |–– db.sqlite3
|   |   |–– models.py
|   |–– migrations/
|   |   |–– . . .
|   |–– venv/
|   |   |–– . . .
|–– frontend/
|   |–– (empty)

я запустил export FLASK_APP=flask_app.app.py перед выполнением следующих команд

flask db init
flask db migrate -m "Initial migration"
flask db upgrade

который автоматически сгенерировал для меня файл db.sqlite3 и папку migrations.

Я считаю, что структура связана с тем, как Flask находит приложение или фабрическую функцию на основе указанного пути к модулю или файлу.

Я не уверен на 100% в причине, но это сработало.

единственные правки, внесенные в код, — это импорт в app.py из-за изменения структуры, теперь они

from flask_app.config import Config
from flask_app.models import db, Document

Попробовав все, включая воссоздание venv, добавил одну строку:

migrate = Migrate(app, db)

в моем файле init.py исправлено сообщение «Ошибка: нет такой команды 'db'», позволяющее выполнить успешную команду flask db init.

Другие вопросы по теме

Миграция базы данных помещений не выполнена должным образом: Причина: java.lang.IllegalStateException:
System.Data.SQLite: убедитесь, что база данных SQLite не пуста (имеет хотя бы одну строку в любой таблице)
Как бороться со структурными ошибками в Rust?
SQL-запросы: наиболее распространенное значение в столбце, сгруппированном по другому столбцу
Комната: Как выполнить запрос на основе составных первичных ключей?
Развертывание Sveltekit на Верселе не удалось из-за ошибки [LibsqlError]: URL_INVALID: URL-адрес не в допустимом формате
Правильно ли настроена моя схема SQLite Prisma для отношений «многие ко многим»? Я получаю сообщение об ошибке при использовании Prisma Studio для настройки фиктивного пользователя
Как получить раскрывающийся список, чтобы сохранить его в базе данных
Сценарий Perl DBI SQLite с несколькими дескрипторами базы данных завершается сбоем из-за заблокированной базы данных, если используются транзакции
Работа с SQLAlchemy и Python. Как обойти ленивую загрузку/ошибки аргументов