Таблицы Flask-SQLAlchemy определены в схеме, но не создаются [дубликат]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Таблицы Flask-SQLAlchemy определены в схеме, но не создаются [дубликат]

Сообщение Anonymous »

Я создаю свою первую простую страницу входа/регистрации RBAC с помощью Flask.
Это структура моего проекта

Код: Выделить всё

├── app.py
├── flask_api
│   ├── __init__.py
│   ├── config.py
│   ├── extensions.py
│   ├── models.py
│   └── routes.py
├── instance
└── migrations
   ├── __pycache__
   ├── env.py
   └── versions
app.py

Код: Выделить всё

from flask_api import create_app

app = create_app()

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

Код: Выделить всё

from flask import Flask
from flask_api.config import Config
from flask_api.extensions import db, migrate, init_extensions, user_datastore
from flask_api.routes import main

def create_app():
app = Flask(__name__)
app.config.from_object(Config)
init_extensions(app) # Initializing extensions
app.register_blueprint(main) # Registering blueprint
return app

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

Код: Выделить всё

from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore
from flask_migrate import Migrate
from flask_api.models import User, Role

db = SQLAlchemy()
migrate = Migrate()
user_datastore = SQLAlchemyUserDatastore(db, User, Role)

def init_extensions(app):
global user_datastore, security
db.init_app(app)
migrate.init_app(app, db)
security = Security(app, user_datastore)
models.py

Код: Выделить всё

from flask_sqlalchemy import SQLAlchemy
from flask_security import UserMixin, RoleMixin

db = SQLAlchemy()

roles_users = db.Table('roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)

class Role(db.Model, RoleMixin):
...

class User(db.Model, UserMixin):
...
routes.py

Код: Выделить всё

from flask import Blueprint, request, jsonify
from flask_api.models import db, User, Role
from flask_api.extensions import user_datastore

main = Blueprint('main', __name__)

@main.route('/user-signup', methods=['POST'])
def user_signup():
data = request.json
if user_datastore.find_user(email=data['email']):
return jsonify(message="Email is already registered"), 400
# More signup logic is there
...

@main.route('/user-login', methods=['POST'])
def user_login():
# More logic
...

Теперь, когда я запускаю app.py с помощью flask run
и делаю запрос POST к конечной точке /user-signup создается файл main.db, но внутри него нет таблиц.
Я знаю, что мне нужно где-то использовать фрагмент кода, чтобы вручную инициировать таблицы:

Код: Выделить всё

with app.app_context():
db.create_all()
Но я не могу понять, куда поместить этот фрагмент кода. Это несколько подходов, которые я пробовал, но все они оказались безуспешными:

[*]Пытался поместить его в app.py после создания приложения = create_app ().
[*]Попробовал добавить init.py внутри метода create_app(), после инициализация расширений.
[*]Пытался поместить его в extensions.py внутри метода init_extensions(app).
< /ul>
Ни один из этих подходов не работает. Может ли кто-нибудь помочь мне с тем, что я здесь делаю неправильно, и с лучшими подходами к проектированию, если таковые имеются.
PS. Я пропустил здесь некоторый код, потому что думал, что он не имеет отношения к вопрос, но я могу поделиться им, если необходимо.
РЕДАКТИРОВАТЬ. Кроме того, если я откажусь от структуры своего проекта и сохраню все в одном файле (__init__.py), то все будет работать нормально. - таблицы создаются прекрасно, все самостоятельно (даже без необходимости в db.create_all()).

Вот почему я твердо верю, что это возможно с моей текущей структурой проекта.
РЕДАКТИРОВАТЬ 2.
Я обновил свой __init__.py следующим образом:

Код: Выделить всё

from flask import Flask
from flask_api.config import Config
from flask_api.extensions import db, migrate, init_extensions, user_datastore
from flask_api.routes import main

def create_app():
app = Flask(__name__)
app.config.from_object(Config)
with app.app_context():
init_extensions(app)
app.register_blueprint(main)
print(db.metadata.tables.keys()) # dict_keys([])
print(db.engine.table_names())   # ['alembic_version']
db.create_all()
return app

if __name__ == '__main__':
app = create_app()
app.run(debug=True)
Итак, даже если метаданные таблицы отсутствуют, db.create_all() здесь ничего не делает.
В моем routes.py Я тестировал с ними -

Код: Выделить всё

from flask import Blueprint, request, jsonify
from flask_api.models import db, User, Role
from flask_api.extensions import user_datastore

main = Blueprint('main', __name__)

@main.route('/user-signup', methods=['POST'])
def user_signup():
print(db.metadata.tables.keys()) # dict_keys(['roles_users', 'role', 'user'])
print(db.engine.table_names())   # ['alembic_version']
import pdb; pdb.set_trace() # To stop further code from executing
# More signup logic is there
...

@main.route('/user-login', methods=['POST'])
def user_login():
# More logic
...

Я не понимаю причину этого очевидного несоответствия.


Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-created
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Таблицы Flask-SQLAlchemy определены в схеме, но не создаются [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Pydantic проверки для дополнительных полей, которые не определены в схеме
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • SQLAlchemy – таблицы не создаются классом базы данных
    Anonymous » » в форуме Python
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • SQLAlchemy – таблицы не создаются классом базы данных
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Временные таблицы создаются постоянно при экспорте данных таблицы через Glue.
    Anonymous » » в форуме MySql
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»