Почему SQLAlchemy не фиксирует изменения? - PullRequest
1 голос
/ 19 июня 2020

Я так много раз делал это раньше успешно, но внезапно я не могу заставить это работать. Я создаю таблицы в своей базе данных MySQL, используя Flask SQLAlchemy в качестве посредника. Также используется адаптер pymysql.

Не могли бы вы проверить правильность моей "сантехники"?

my init .py:

import werkzeug
werkzeug.cached_property = werkzeug.utils.cached_property
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from .config import DevConfig

db = SQLAlchemy()
bcrypt = Bcrypt()

def create_app(script_info=None):
    app = Flask(__name__)
    app.config.from_object(DevConfig)
    bcrypt.init_app(app)
    db.init_app(app)

    from .flask_app import users_blueprint
    app.register_blueprint(users_blueprint)

    @app.shell_context_processor
    def ctx():
        return {'app': app, 'db': db}

    return app

models.py:

from project import db, bcrypt


class User(db.Model):

    __tablename__ = 'users'

    ...
    ...

config.py:

import os


class BaseConfig:
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://mark:supersecret@localhost/database1?charset=utf8mb4'   #  the "?charset" thingy is there to avoid encoding warnings from SQLAlchemy
    SECRET_KEY = 'pythonrocks'

class DevConfig(BaseConfig):
    DEBUG = True

class ProdConfig(BaseConfig):
    DEBUG = False

интерпретатор:

Instance: /home/mark/project/instance
In [1]: db                                                                                                                                            
Out[1]: <SQLAlchemy engine=mysql+pymysql://mark:***@localhost/database1?charset=utf8mb4>

In [2]: db.create_all()                                                                                                                               

In [3]: db.session.commit() 

Я не получаю сообщения об ошибке. Таблицы просто не создаются при фиксации.

mysql> show tables;
Empty set (0.00 sec)

Как я могу проверить причину этого? Сервер разработки запущен.

1 Ответ

0 голосов
/ 19 июня 2020

Вы не импортируете свои модели перед вызовом db.create_all() - SQLAlchemy просто не знает о ваших моделях - и поэтому не может создавать таблицы.

Сначала импортируйте его, затем вызовите db.create_all() и db.session.commit().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...