Таблицы 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 после создания app = create_app().
  • Пытался добавить init.py внутри create_app() после инициализации расширений.
    Пытался поместить его в extensions.py внутри метода init_extensions(app). li>
Каждый из них не работает
Может кто-нибудь подсказать мне, что я здесь делаю неправильно, и улучшить дизайн подходы, если это возможно.
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() здесь ничего не дает.
В моем < strong>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 Ответы
    16 Просмотры
    Последнее сообщение 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»