Я создаю приложение 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: нет модуля с именем «бэкэнд».
В каталоге backend
введите следующую команду, чтобы запустить оболочку Flask:
flask shell
Импортируйте базу данных и создайте таблицы:
from app.models import db
db.create_all()
См. https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/
я начал проект заново и изменил структуру проекта. сейчас
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
.
Я пытался это сделать, но получаю
ModuleNotFoundError: No module named 'backend'
то же самое, что и при попыткеflask db init
, и пока не понял почему