Невозможно перенести базу данных Flask: нет такой команды «db»

Я новичок в Flask, Я настраивал первую версию своего приложения Flask: test-app с базой данных MySQL. Теперь я хочу изменить и добавить несколько столбцов в таблицу базы данных, не стирая существующие данные. Я слышал о Flask-migrate с Alembic как о решении этой проблемы. Я пытался все настроить, но вылезла такая ошибка:

Error: Failed to find Flask application or factory in module 'test-app.app'. Use 'test-app.app:name' to specify one.

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

Error: No such command 'db'.

при запуске этой команды в моем .env: flask db migrate -m "initial migration"

Я не понимаю, вот скелет моего приложения Flask

test-app/
 .venv/
 app/
  models/
   __init__.py
   domain.py
   subdomain.py
 app.py

Некоторые файлы:

модели/__init__.py

from os.path import dirname, basename, isfile, join
from sqlalchemy.pool import QueuePool
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(engine_options = {"pool_size": 10, 'pool_recycle': 280, "poolclass":QueuePool, "pool_pre_ping":True})

import glob
modules = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')]

модели/domain.py (очень похоже на subdomain.py)

from dataclasses import dataclass
from . import db

@dataclass
class Domain(db.Model):

    __tablename__ = 'domain'
    __table_args__ = {'extend_existing': True} 

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)

app.py

from flask import Flask, request, jsonify, json
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.event import listens_for
from flaskext.mysql import MySQL
from flask_cors import CORS
from dataclasses import dataclass
from sqlalchemy import text
from urllib.parse import quote
from flask_migrate import Migrate    

app = Flask(__name__)
CORS(app, origins=["http://localhost:3000", "http://localhost:3000"])


from app.models import db

mysql =MySQL()

@dataclass
class User(db.Model):

    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(46), nullable=False)#1
    lastname = db.Column(db.String(46), nullable=False)#1
    

    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    def as_dict(self):
        excluded_fields = ['id']
        return {field.name:getattr(self, field.name) for field in self.__table__.c if field.name not in excluded_fields}

@dataclass
class User(db.Model):

    __tablename__ = 'user'
    __table_args__ = {'extend_existing': True} 

    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(46), nullable=False)#1
    lastname = db.Column(db.String(46), nullable=False)#1

    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    def as_dict(self):
        excluded_fields = ['id']
        return {field.name:getattr(self, field.name) for field in self.__table__.c if field.name not in excluded_fields}



app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:[email protected]/test'

db.init_app(app)
with app.app_context():
    from app.models import *
    migrate = Migrate(app, db)
    db.create_all()


@app.route('/users', methods=['GET'])
def get_user():
    users = User.query.all()
    return jsonify(users)

@app.route('/user/<firstname>', methods=['GET'])
def user_byfirstname(firstname):
    user = User.query.filter_by(firstname = firstname).first()
    return jsonify(user.as_dict())

if __name__ == '__main__':
   app.run(debug=True)

требования.txt

aiohttp==3.8.6
aiohttp-retry==2.8.3
aiosignal==1.3.1
alembic==1.13.1
async-timeout==4.0.3
attrs==23.1.0
blinker==1.6.3
certifi==2023.7.22
cffi==1.16.0
charset-normalizer==3.3.1
click==8.1.7
cryptography==41.0.7
distlib==0.3.7
filelock==3.12.4
Flask==2.3.0
Flask-Cors==4.0.0
flask-marshmallow==0.14.0
Flask-Migrate==4.0.7
Flask-MySQL==1.5.2
Flask-MySQLdb==2.0.0
Flask-Script==2.0.6
Flask-SQLAlchemy==3.1.1
flask-talisman==1.1.0
frozenlist==1.4.0
idna==3.4
itsdangerous==2.1.2
Jinja2==3.1.2
Mako==1.3.3
MarkupSafe==2.1.3
marshmallow-sqlalchemy==0.29.0
multidict==6.0.4
mysqlclient==2.2.0
packaging==23.2
platformdirs==3.11.0
psycopg2-binary==2.9.9
pycparser==2.21
PyJWT==2.8.0
PyMySQL==1.1.0
pyOpenSSL==23.3.0
python-dotenv==1.0.0
requests==2.31.0
six==1.16.0
SQLAlchemy==2.0.22
twilio==8.10.0
typing_extensions==4.8.0
urllib3==2.0.7
virtualenv==20.24.5
waitress==2.1.2
Werkzeug==3.0.0
WSGIserver==1.3
yarl==1.9.2

Пожалуйста помоги!

Почему в 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
400
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение. flask db migrate -m "initial migration" вылетает, потому что у меня есть папка и файл с одинаковым именем в одном корне (app/ и app.py). Я переименовал app/ в common/ и это решило мою проблему.

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